我之前一直覺得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