您好,登錄后才能下訂單哦!
我以前一直以為bat不能像Linux的shell一樣設置函數并且調用,事實上我發現這是可以的。不過由于批處理的特性是一行一行執行的,這種label的函數必須要寫在文本的最后。如果寫在了批處理命令的前面,bat會逐行運行里面的命令的。寫在文檔的最后面,并且在“函數區域”前跳過這些代碼。
(順便吐槽一下,這種函數的寫法和linux的shell很不一樣,shell的function中的命令必須寫在命令的前面,讓shell逐行運行一次,才能在后面的命令中被人調用。)
函數的寫法:
::在這個例子中我試圖寫的一個函數起名為testfunction,它的操作就是運行一個echo命令。
::使用call命令,并且在后面寫入函數名,函數名的前方寫一個:代表這是一個label。
call :testfunction
::這個goto命令讓批處理在運行的時候跳過所有函數的部分。
goto EOF
::從下面一行開始就是函數的部分,它們應該是bat腳本的最后部分,理論上不應該在下方再寫任何的命令了。首先如同goto的命令一樣,首先要先寫一個lable
:testfunction
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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。