BAT腳本的一些技巧寫法

我之前一直覺得bat不能像Linux的shell同樣設置函數而且調用,事實上我發現這是能夠的。不過因爲批處理的特性是一行一行執行的,這種label的函數必需要寫在文本的最後。若是寫在了批處理命令的前面,bat會逐行運行裏面的命令的。寫在文檔的最後面,而且在「函數區域」前跳過這些代碼。linux

(順便吐槽一下,這種函數的寫法和linux的shell很不同,shell的function中的命令必須寫在命令的前面,讓shell逐行運行一次,才能在後面的命令中被人調用。)shell


函數的寫法:
ide

::在這個例子中我試圖寫的一個函數起名爲testfunction,它的操做就是運行一個echo命令。函數

::使用call命令,而且在後面寫入函數名,函數名的前方寫一個:表明這是一個label。spa

call :testfunctiontoken



::這個goto命令讓批處理在運行的時候跳過全部函數的部分。
ip

goto EOFrem


::從下面一行開始就是函數的部分,它們應該是bat腳本的最後部分,理論上不該該在下方再寫任何的命令了。首先如同goto的命令同樣,首先要先寫一個lable文檔

:testfunctionget

echo Test function is running.

rem exit /b 會讓程序跳轉到調用函數的命令處,而不是直接退出程序。

exit /b


:EOF

::以上就是示例腳本的全部內容。


固然你能夠不把函數內容寫在這個bat中,而是另外寫一個bat文件,而後call這個bat的絕對路徑,那也是能夠的。爲了方便我就暫時稱呼我運行的腳本名字爲a.bat,而調用的腳本爲b.bat。

a.bat的內容是。

set a=aaa

call b.bat

echo %b%

pause

而b.bat的內容是

echo %a%

set b=bbb

在這兩個腳本中a腳本和b腳本各自定義了一個變量,而沒有定義另一個腳本中定義的變量,可是echo的又互相是對方腳本中定義的變量。若是隻有單獨的腳本,兩個腳本的echo命令是返回不了任何內容的。可是若是你運行了a腳本而且調用了b腳本,能夠發現,call調用的腳本之間的變量是能夠互通的。不過腳本之間的goto的label不能互通,即你不能在a腳本中goto到b的一個label中去。

並且不能不寫call命令,若是不寫而是直接寫b腳本的路徑,bat依舊能夠運行,不過運行完b腳本以後,整個批處理就退出了。例如咱們將a腳本中的call b.bat中的call去掉,那麼腳本只會打印變量a的值,而後賦值變量b,可是不回會到a腳本再次打印b的值。



經過set /p 命令去獲取另一個文本文件裏的值

寫法是:

set /p var=<c:\path\to\file.txt

這樣file.txt裏的值就到了var這個變量裏去了,不過這個寫法要求txt只有一行,若是有多行,那麼也只會取第一行的內容。


那若是想要其餘的行,那麼這個就要用到for循環了。經過for循環能夠讀取文本文件(或一個命令的結果)每一行的特性,將一行的內容賦值到一個變量裏,不過若是光寫for循環而不使用計數器的話,那麼變量的值會被反覆覆蓋,僅保留最後一行的值。

set num=0

for /f "tokens=1" %%i in ('wmic LogicalDisk where "Caption='C:'" get Size ^| find /v /i "size"') do (

set /a num=!num!+1

if !num!==1 (set C_size=%%i)

)

要注意的是計數器因爲是不停的變化的,所以要用延時變量,用!包起來而不是%,而for循環的變量是%%連續兩個百分號表示的。若是輸入的命令中有管道命令|,要用轉移符^轉譯。

for的token參數能夠決定一行根據指定的分隔符(默認是空格)分割成幾段,取第幾段。若是你寫的是表格的話,那就是第幾列,而num計數器能夠在if裏找行。這樣的話這個循環就能取出列和行中的指定數據,賦值到一個變量裏。



在bat中調用vbs。

固然自己的命令是很是簡單的直接call就能夠了,call xxx.vbs

不過這裏要說的是將bat中的一些變量的值傳遞到vbs中去,

文件裏調用

例如:

在bat中

set a=testmessage

call b.vbs /messageargs:%a%

在vbs中用

set wshnamed=wscript.arguments.named

msgbox wshnamed.item("messageargs")

這樣的寫法來獲取bat變量。


以管理員身份運行bat

%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit

相關文章
相關標籤/搜索