BAT腳本的一些技巧寫(xiě)法

我以前一直以為bat不能像Linux的shell一樣設(shè)置函數(shù)并且調(diào)用,事實(shí)上我發(fā)現(xiàn)這是可以的。不過(guò)由于批處理的特性是一行一行執(zhí)行的,這種label的函數(shù)必須要寫(xiě)在文本的最后。如果寫(xiě)在了批處理命令的前面,bat會(huì)逐行運(yùn)行里面的命令的。寫(xiě)在文檔的最后面,并且在“函數(shù)區(qū)域”前跳過(guò)這些代碼。

在夾江等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì) 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),營(yíng)銷(xiāo)型網(wǎng)站建設(shè),外貿(mào)網(wǎng)站制作,夾江網(wǎng)站建設(shè)費(fèi)用合理。

(順便吐槽一下,這種函數(shù)的寫(xiě)法和linux的shell很不一樣,shell的function中的命令必須寫(xiě)在命令的前面,讓shell逐行運(yùn)行一次,才能在后面的命令中被人調(diào)用。)

函數(shù)的寫(xiě)法:

::在這個(gè)例子中我試圖寫(xiě)的一個(gè)函數(shù)起名為testfunction,它的操作就是運(yùn)行一個(gè)echo命令。

::使用call命令,并且在后面寫(xiě)入函數(shù)名,函數(shù)名的前方寫(xiě)一個(gè):代表這是一個(gè)label。

call :testfunction

::這個(gè)goto命令讓批處理在運(yùn)行的時(shí)候跳過(guò)所有函數(shù)的部分。

goto EOF

::從下面一行開(kāi)始就是函數(shù)的部分,它們應(yīng)該是bat腳本的最后部分,理論上不應(yīng)該在下方再寫(xiě)任何的命令了。首先如同goto的命令一樣,首先要先寫(xiě)一個(gè)lable

:testfunction

echo Test function is running.

rem exit /b 會(huì)讓程序跳轉(zhuǎn)到調(diào)用函數(shù)的命令處,而不是直接退出程序。

exit /b

:EOF

::以上就是示例腳本的所有內(nèi)容。

當(dāng)然你可以不把函數(shù)內(nèi)容寫(xiě)在這個(gè)bat中,而是另外寫(xiě)一個(gè)bat文件,然后call這個(gè)bat的絕對(duì)路徑,那也是可以的。為了方便我就暫時(shí)稱(chēng)呼我運(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è)變量,而沒(méi)有定義另外一個(gè)腳本中定義的變量,但是echo的又互相是對(duì)方腳本中定義的變量。如果只有單獨(dú)的腳本,兩個(gè)腳本的echo命令是返回不了任何內(nèi)容的。但是如果你運(yùn)行了a腳本并且調(diào)用了b腳本,可以發(fā)現(xiàn),call調(diào)用的腳本之間的變量是可以互通的。不過(guò)腳本之間的goto的label不能互通,即你不能在a腳本中g(shù)oto到b的一個(gè)label中去。

而且不能不寫(xiě)call命令,如果不寫(xiě)而是直接寫(xiě)b腳本的路徑,bat依舊可以運(yùn)行,不過(guò)運(yùn)行完b腳本之后,整個(gè)批處理就退出了。例如我們將a腳本中的call b.bat中的call去掉,那么腳本只會(huì)打印變量a的值,然后賦值變量b,但是不回會(huì)到a腳本再次打印b的值。

通過(guò)set /p 命令去獲取另外一個(gè)文本文件里的值

寫(xiě)法是:

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

這樣file.txt里的值就到了var這個(gè)變量里去了,不過(guò)這個(gè)寫(xiě)法要求txt只有一行,如果有多行,那么也只會(huì)取第一行的內(nèi)容。

那如果想要其他的行,那么這個(gè)就要用到for循環(huán)了。通過(guò)for循環(huán)可以讀取文本文件(或一個(gè)命令的結(jié)果)每一行的特性,將一行的內(nèi)容賦值到一個(gè)變量里,不過(guò)如果光寫(xiě)for循環(huán)而不使用計(jì)數(shù)器的話,那么變量的值會(huì)被反復(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í)變量,用!包起來(lái)而不是%,而for循環(huán)的變量是%%連續(xù)兩個(gè)百分號(hào)表示的。如果輸入的命令中有管道命令|,要用轉(zhuǎn)移符^轉(zhuǎn)譯。

for的token參數(shù)可以決定一行根據(jù)指定的分隔符(默認(rèn)是空格)分割成幾段,取第幾段。如果你寫(xiě)的是表格的話,那就是第幾列,而num計(jì)數(shù)器可以在if里找行。這樣的話這個(gè)循環(huán)就能取出列和行中的指定數(shù)據(jù),賦值到一個(gè)變量里。

在bat中調(diào)用vbs。

當(dāng)然本身的命令是非常簡(jiǎn)單的直接call就可以了,call xxx.vbs

不過(guò)這里要說(shuō)的是將bat中的一些變量的值傳遞到vbs中去,

文件里調(diào)用

例如:

在bat中

set a=testmessage

call b.vbs /messageargs:%a%

在vbs中用

set wshnamed=wscript.arguments.named

msgbox wshnamed.item("messageargs")

這樣的寫(xiě)法來(lái)獲取bat變量。

以管理員身份運(yùn)行bat

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

新聞名稱(chēng):BAT腳本的一些技巧寫(xiě)法
路徑分享:http://bm7419.com/article44/igsjhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站、小程序開(kāi)發(fā)做網(wǎng)站、網(wǎng)站制作、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站