BAT腳本的一些技巧寫法

我以前一直以為bat不能像Linux的shell一樣設(shè)置函數(shù)并且調(diào)用,事實上我發(fā)現(xiàn)這是可以的。不過由于批處理的特性是一行一行執(zhí)行的,這種label的函數(shù)必須要寫在文本的最后。如果寫在了批處理命令的前面,bat會逐行運行里面的命令的。寫在文檔的最后面,并且在“函數(shù)區(qū)域”前跳過這些代碼。?
(順便吐槽一下,這種函數(shù)的寫法和linux的shell很不一樣,shell的function中的命令必須寫在命令的前面,讓shell逐行運行一次,才能在后面的命令中被人調(diào)用。)?
函數(shù)的寫法:?
::在這個例子中我試圖寫的一個函數(shù)起名為testfunction,它的操作就是運行一個echo命令。?
::使用call命令,并且在后面寫入函數(shù)名,函數(shù)名的前方寫一個:代表這是一個label。?
call :testfunction?
::這個goto命令讓批處理在運行的時候跳過所有函數(shù)的部分。?
goto EOF?
::從下面一行開始就是函數(shù)的部分,它們應(yīng)該是bat腳本的最后部分,理論上不應(yīng)該在下方再寫任何的命令了。首先如同goto的命令一樣,首先要先寫一個lable?
:testfunction?
echo Test function is running.?
rem exit /b?會讓程序跳轉(zhuǎn)到調(diào)用函數(shù)的命令處,而不是直接退出程序。?
exit /b?
:EOF?
::以上就是示例腳本的所有內(nèi)容。?
當(dāng)然你可以不把函數(shù)內(nèi)容寫在這個bat中,而是另外寫一個bat文件,然后call這個bat的絕對路徑,那也是可以的。為了方便我就暫時稱呼我運行的腳本名字為a.bat,而調(diào)用的腳本為b.bat。?
a.bat的內(nèi)容是。?
set a=aaa?
call b.bat?
echo %b%?
pause?
而b.bat的內(nèi)容是?
echo %a%?
set b=bbb?
在這兩個腳本中a腳本和b腳本各自定義了一個變量,而沒有定義另外一個腳本中定義的變量,但是echo的又互相是對方腳本中定義的變量。如果只有單獨的腳本,兩個腳本的echo命令是返回不了任何內(nèi)容的。但是如果你運行了a腳本并且調(diào)用了b腳本,可以發(fā)現(xiàn),call調(diào)用的腳本之間的變量是可以互通的。不過腳本之間的goto的label不能互通,即你不能在a腳本中g(shù)oto到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只有一行,如果有多行,那么也只會取第一行的內(nèi)容。?
那如果想要其他的行,那么這個就要用到for循環(huán)了。通過for循環(huán)可以讀取文本文件(或一個命令的結(jié)果)每一行的特性,將一行的內(nèi)容賦值到一個變量里,不過如果光寫for循環(huán)而不使用計數(shù)器的話,那么變量的值會被反復(fù)覆蓋,僅保留最后一行的值。?
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)?
)?
要注意的是計數(shù)器由于是不停的變化的,因此要用延時變量,用!包起來而不是%,而for循環(huán)的變量是%%連續(xù)兩個百分號表示的。如果輸入的命令中有管道命令|,要用轉(zhuǎn)移符^轉(zhuǎn)譯。?
for的token參數(shù)可以決定一行根據(jù)指定的分隔符(默認(rèn)是空格)分割成幾段,取第幾段。如果你寫的是表格的話,那就是第幾列,而num計數(shù)器可以在if里找行。這樣的話這個循環(huán)就能取出列和行中的指定數(shù)據(jù),賦值到一個變量里。?
在bat中調(diào)用vbs。?
當(dāng)然本身的命令是非常簡單的直接call就可以了,call xxx.vbs?
不過這里要說的是將bat中的一些變量的值傳遞到vbs中去,?
文件里調(diào)用?
例如:?
在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
了解更多網(wǎng)絡(luò)知識關(guān)注:http://www.vecloud.com/