我以前一直以為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=這樣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 ***.vbs
不過這裡要說的是將bat中的一些變數的值傳遞到vbs中去,
檔案裡呼叫
例如:在bat中
set a=testmessage
call b.vbs /messageargs:%a%
在vbs中用
set wshnamed=wscript.arguments.named
msgbox wshnamed.item("messageargs")
這樣的寫法來獲取bat變數。
以管理員身份執行bat
最近的一些bat小指令碼
計算目錄下的檔案個數,並新增到目錄名中 echo off setlocal enabledelayedexpansion 變數延遲 for f i in dir a d b dp0 do set a n 0 for r j in i do set a n 1 echo.i n 上面可以用來檢查檔名 ...
bat 的一些操作
把d test test.txt這個檔案複製到d盤根目錄下,那麼,使用 copy d test test.txt d 就可以輕易辦到。copy y d test test.txt d copy y d test user 01 test.txt d files 如果要複製的路徑帶有空格 等特殊符號的...
一些巨集的寫法
1.宣告乙個常數用以表示1年中有多少秒 忽略閏年問題 define seconds per year 60 60 24 365 ul 2.返回兩個數的較大數 不能使用大於 小於 if語句 define max a,b abs a b a b a b 3.返回兩個數的較小數 define min a,...