我以前一直以為bat不能像Linux的shell一樣設(shè)置函數(shù)并且調(diào)用,事實(shí)上我發(fā)現(xiàn)這是可以的。不過由于批處理的特性是一行一行執(zhí)行的,這種label的函數(shù)必須要寫在文本的最后。如果寫在了批處理命令的前面,bat會逐行運(yùn)行里面的命令的。寫在文檔的最后面,并且在“函數(shù)區(qū)域”前跳過這些代碼。
在夾江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營銷型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,夾江網(wǎng)站建設(shè)費(fèi)用合理。
(順便吐槽一下,這種函數(shù)的寫法和linux的shell很不一樣,shell的function中的命令必須寫在命令的前面,讓shell逐行運(yùn)行一次,才能在后面的命令中被人調(diào)用。)
函數(shù)的寫法:
::在這個(gè)例子中我試圖寫的一個(gè)函數(shù)起名為testfunction,它的操作就是運(yùn)行一個(gè)echo命令。
::使用call命令,并且在后面寫入函數(shù)名,函數(shù)名的前方寫一個(gè):代表這是一個(gè)label。
call :testfunction
::這個(gè)goto命令讓批處理在運(yùn)行的時(shí)候跳過所有函數(shù)的部分。
goto EOF
::從下面一行開始就是函數(shù)的部分,它們應(yīng)該是bat腳本的最后部分,理論上不應(yīng)該在下方再寫任何的命令了。首先如同goto的命令一樣,首先要先寫一個(gè)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)容寫在這個(gè)bat中,而是另外寫一個(gè)bat文件,然后call這個(gè)bat的絕對路徑,那也是可以的。為了方便我就暫時(shí)稱呼我運(yùn)行的腳本名字為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
在這兩個(gè)腳本中a腳本和b腳本各自定義了一個(gè)變量,而沒有定義另外一個(gè)腳本中定義的變量,但是echo的又互相是對方腳本中定義的變量。如果只有單獨(dú)的腳本,兩個(gè)腳本的echo命令是返回不了任何內(nèi)容的。但是如果你運(yùn)行了a腳本并且調(diào)用了b腳本,可以發(fā)現(xiàn),call調(diào)用的腳本之間的變量是可以互通的。不過腳本之間的goto的label不能互通,即你不能在a腳本中g(shù)oto到b的一個(gè)label中去。
而且不能不寫call命令,如果不寫而是直接寫b腳本的路徑,bat依舊可以運(yùn)行,不過運(yùn)行完b腳本之后,整個(gè)批處理就退出了。例如我們將a腳本中的call b.bat中的call去掉,那么腳本只會打印變量a的值,然后賦值變量b,但是不回會到a腳本再次打印b的值。
通過set /p 命令去獲取另外一個(gè)文本文件里的值
寫法是:
set /p var=<c:\path\to\file.txt
這樣file.txt里的值就到了var這個(gè)變量里去了,不過這個(gè)寫法要求txt只有一行,如果有多行,那么也只會取第一行的內(nèi)容。
那如果想要其他的行,那么這個(gè)就要用到for循環(huán)了。通過for循環(huán)可以讀取文本文件(或一個(gè)命令的結(jié)果)每一行的特性,將一行的內(nèi)容賦值到一個(gè)變量里,不過如果光寫for循環(huán)而不使用計(jì)數(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)
)
要注意的是計(jì)數(shù)器由于是不停的變化的,因此要用延時(shí)變量,用!包起來而不是%,而for循環(huán)的變量是%%連續(xù)兩個(gè)百分號表示的。如果輸入的命令中有管道命令|,要用轉(zhuǎn)移符^轉(zhuǎn)譯。
for的token參數(shù)可以決定一行根據(jù)指定的分隔符(默認(rèn)是空格)分割成幾段,取第幾段。如果你寫的是表格的話,那就是第幾列,而num計(jì)數(shù)器可以在if里找行。這樣的話這個(gè)循環(huán)就能取出列和行中的指定數(shù)據(jù),賦值到一個(gè)變量里。
在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變量。
以管理員身份運(yùn)行bat
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
新聞名稱:BAT腳本的一些技巧寫法
路徑分享:http://aaarwkj.com/article44/igsjhe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、自適應(yīng)網(wǎng)站、小程序開發(fā)、做網(wǎng)站、網(wǎng)站制作、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)