<b>dos批處理進階教程</b>
前言
本教程主要引用傷腦筋版主的系列文章,同時參考引用[英雄]教程等其他批處理教程,本文将這些文章合并在一起,并盡量修改得詳細而且簡單易懂,修改整理也是學習過程,主要目的是友善自己以後查閱。
本教程很長啊,需要一定的耐心才能看完,能夠看完的話,差不多就是批處理高手了,即使不是高手也是熟手了。本教程還在不斷補充之中,當有比較典型的應用技巧時,本教材會将其收入相關的章節之中。本教程适合對dos有一定基礎的人慢慢學習或查閱。
查閱方法:複制目錄中的條目,搜尋即可。
整理者郵箱:[email protected],如果你要全文或有好的dos使用經驗,請你發email給我,謝謝!
目錄
第一章 批處理基礎
第一節 常用批處理内部指令簡介
1、rem 和 ::
2、echo 和 @
3、pause 暫停
4、errorlevel
5、title 設定cmd視窗的标題
6、color 設定cmd視窗前景和背景顔色
7、mode 配置系統裝置
8、goto 和 :
9、find 在檔案中搜尋字元串
10、start 調用外部程式并任其在新視窗自行運作
11、assoc 和 ftype
12、pushd 和 popd
13、call 調用批處理程式或指令并等待其執行完畢
14、shift
15、if
16、setlocal 與 變量延遲
17、attrib 顯示或更改檔案屬性
18、findstr 在檔案中搜尋字元串(find增強版)
19、date /t 和 time /t
第二節 常用特殊符号
1、@ 指令行回顯屏蔽符
2、% 批處理變量引導符
3、> 輸出重定向符
4、>> 輸出重定向符
5、<、>&、<& 重定向符
6、| 指令管道符
7、^ 轉義字元
8、& 組合指令(順序執行)
9、&& 組合指令(前面指令成功,才執行後面指令)
10、|| 組合指令(前面指令失敗,才執行後面指令)
11、"" 字元串界定符
12、, 逗号
13、; 分号
14、() 括号
15、! 感歎号
16、批進行中可能會見到的其它特殊标記符: (略)
cr(0d) 指令行結束符
escape(1b) ansi轉義字元引導符
space(20) 常用的參數界定符
tab(09) ; = 不常用的參數界定符
+ copy指令檔案連接配接符
* ? 檔案通配符
/ 參數開關引導符
: 批處理标簽引導符
第二章 for指令詳解
一、基本格式
二、參數 /d 主要搜尋比對目錄
三、參數 /r 搜尋指定目錄樹中的比對檔案
四、參數 /l 按數字序列(start,step,end)循環
五、參數 /f 處理指令輸出、字元串及檔案内容
第三章 for指令中的變量
一、 ~i - 删除任何引号("),擴充 %i
二、 %~fi - 将 %i 擴充到一個完全合格的路徑名
三、 %~di - 僅将 %i 擴充到一個驅動器号
四、 %~pi - 僅将 %i 擴充到一個路徑
五、 %~ni - 僅将 %i 擴充到一個檔案名
六、 %~xi - 僅将 %i 擴充到一個檔案擴充名
七、 %~si - 擴充的路徑隻含有短名
八、 %~ai - 将 %i 擴充到檔案的檔案屬性
九、 %~ti - 将 %i 擴充到檔案的日期/時間
十、 %~zi - 将 %i 擴充到檔案的大小
十一、 %~$path:i
第四章 批進行中的變量
一、系統變量
二、自定義變量
第五章 set指令詳解
一、用set指令設定自定義變量
二、用set指令進行簡單計算
三、用set指令進行字元串處理
1、字元串替換
2、字元串截取
第六章 if指令講解
第一種用法:if [not] errorlevel number command
第二種用法:if [not] string1==string2 command
第三種用法:if [not] exist filename command
第四種用法:if增強的用法
第七章 dos程式設計進階技巧
一、互動界面設計
二、if…else…條件語句
三、循環語句
四、子程式
五、用ftp指令實作自動下載下傳
六、用7-zip實作指令行壓縮和解壓功能
七、調用vbscript程式
八、将批處理轉化為可執行檔案
九、時間延遲
1、利用ping指令延時
2、利用for指令延時
3、利用vbs延遲函數,精确度毫秒,誤差1000毫秒内
4、僅用批處理指令實作任意時間延遲,精确度10毫秒,誤差50毫秒内
十、模拟進度條
十一、特殊字元的輸入及應用
十二、随機數(%random%)的應用技巧
十三、變量嵌套 與 指令嵌套
十四、檔案内容篩選(type和findstr指令結合使用)
全文:http://xiangkg.blog.163.com
1、更正了所有的錯别字,适當排版,增加條理性。
2、運作改善所有例子,并糾正了一些文法錯誤。
3、補充了一些不完全的地方。
4、第一章參考了網上許多教程彙編而成。
5、20080229補充了變量延遲的問題。
6、20080305修改了參數usebackq的說明
7、20080310增加了特殊字元的輸入及應用
8、20080311修改了子程式部分
9、20080313修改了echo說明,歸納了9個應用方法
10、20080320增加任意時間延遲方法
11、20080321增加了set計算中十進制與八進制混淆問題的說明
12、20080325修正dos數值計算範圍:-2147483648至2147483647,即-2^31~2^31-1
13、20080326增加随機數的應用
14、20080327修改了“if增強用法”中的defined語句說明
15、20080402增加變量嵌套與指令嵌套,重要技巧之一。
不斷學習中,不斷更新中。
======================================================================
批處理定義:顧名思義,批處理檔案是将一系列指令按一定的順序集合為一個可執行的文本檔案,其擴充名為bat或者cmd。這些指令統稱批處理指令。
小知識:可以在鍵盤上按下ctrl+c組合鍵來強行終止一個批處理的執行過程。
了解了大概意思後,我們正式開始學習.先看一個簡單的例子!
@echo off
echo "歡迎來到非常bat!"
pause
把上面的3條指令儲存為檔案test.bat或者test.cmd然後執行,
他就會在螢幕上顯示以下二行話:
歡迎來到非常bat!
請按任意鍵繼續. . .
這就是一個簡單批處理檔案了,這個批處理檔案一共就用了2條指令 "echo" 和"pause" 還有一個特殊符号"@"
從上面這個簡單的批進行中,我們可以發現其實批處理就是運用一些含有特殊意義的符号和一些完成指定功能的指令組合而成,那麼在批進行中有多少這樣的特殊符号和功能指令呢?我們現在就來仔細了解一下一些最常用的!
(以下内容來源網絡,請各位仔細閱讀,好進入下節的執行個體說明)
==========================================================================
介紹指令
1、rem 和 ::
rem為注釋指令,一般用來給程式加上注解,該指令後的内容不被執行,但能回顯。
:: 也可以起注釋作用, 而且更簡潔有效; 但有兩點需要注意:
①任何以冒号:開頭的字元行, 在批進行中都被視作标号, 而直接忽略其後的所有内容。而标号分為有效和無效兩種。
有效标号:冒号後緊跟一個以字母數字開頭的字元串,goto語句可以識别。
無效标号:冒号後緊跟一個非字母數字的一個特殊符号,goto無法識别的标号。
無效可以起到注釋作用,是以 :: 常被用作注釋符号,其實 :+ 也可起注釋作用。
②與rem 不同的是, ::後的字元行在執行時不會回顯, 無論是否用echo on打開指令行回顯狀态, 因為指令解釋器不認為他是一個有效的指令行, 就此點來看, rem 在某些場合下将比 :: 更為适用; 另外, rem 可以用于 config.sys 檔案中。
行内注釋格式:%注釋内容% (不常用,容易引起文法錯誤,慎用少用)
2、echo 和 @
@字元放在指令前将關閉該指令回顯,無論此時echo是否為打開狀态。
echo指令的作用列舉如下:
(1)打開回顯或關閉回顯功能
格式:echo [{ on|off }]
如果想關閉“echo off”指令行自身的顯示,則需要在該指令行前加上“@”。
(2)顯示目前echo設定狀态
格式:echo
(3)輸出提示資訊
格式:echo 資訊内容
上述是echo指令常見的三種用法,也是大家熟悉和會用的,但作為dos指令淘金者你還應該知道下面的技巧:
(4)關閉dos指令提示符
在dos提示符狀态下鍵入echo off,能夠關閉dos提示符的顯示使螢幕隻留下光标,直至鍵入echo on,提示符才會重新出現。
(5)輸出空行,即相當于輸入一個回車
格式:echo.
值得注意的是指令行中的“.”要緊跟在echo後面中間不能有空格,否則“.”将被當作提示資訊輸出到螢幕。另外“.”可以用,:;”/[\]+等任一符号替代。
指令echo.輸出的回車,經dos管道轉向可以作為其它指令的輸入,比如echo.|time即相當于在time指令執行後給出一個回車。是以執行時系統會在顯示目前時間後,自動傳回到dos提示符狀态
(6)答複指令中的提問
格式:echo 答複語|指令檔案名
上述格式可以用于簡化一些需要人機對話的指令(如:chkdsk/f;format drive:;del *.*)的操作,它是通過dos管道指令把echo指令輸出的預置答複語作為人機對話指令的輸入。下面的例子就相當于在調用的指令出現人機對話時輸入“y”回車:
c:>echo y|chkdsk/f
c:>echo y|del a :*.*
(7)建立新檔案或增加檔案内容
格式:echo 檔案内容>檔案名
echo 檔案内容>>檔案名
例如:
c:>echo @echo off>autoexec.bat 建立自動批處理檔案
c:>echo c:\cpav\bootsafe>>autoexec.bat 向自動批處理檔案中追加内容
(8)向列印機輸出列印内容或列印控制碼
格式:echo 列印機控制碼>prn
echo 列印内容>prn
用得很少,了解就可以了
下面的例子是向m-1724列印機輸入列印控制碼。<alt>156是按住alt鍵在小鍵盤鍵入156,類似情況依此類推:
c:>echo +156+42+116>prn(輸入下劃線指令fs*t)
c:>echo prn">+155@>prn(輸入初始化指令esc@)
c:>echo.>prn(換行)
(9)使喇叭鳴響
c:>echo ^g
“^g”是在dos視窗中用ctrl+g或alt+007輸入,輸入多個^g可以産生多聲鳴響。使用方法是直接将其加入批處理檔案中或做成批處理檔案調用。
這裡的“^g”屬于特殊符号的使用,請看本文後面的章節
3、pause 暫停
pause,玩遊戲的人都知道,暫停的意思
在這裡就是停止系統指令的執行并顯示下面的内容。
例:
運作顯示:
要顯示其他提示語,可以這樣用:
echo 其他提示語 & pause > nul
4、errorlevel 程式傳回碼
echo %errorlevel%
每個指令運作結束,可以用這個指令行格式檢視傳回碼
用于判斷剛才的指令是否執行成功
預設值為0,一般指令執行出錯會設 errorlevel 為1
5、title 設定cmd視窗的标題
設定cmd視窗的标題,批處理程式設計常用。
title 新标題 #可以看到cmd視窗的标題欄變了
6、color 設定cmd視窗前景和背景顔色
設定預設的控制台前景和背景顔色。批處理程式設計常用。
color [attr]
attr 指定控制台輸出的顔色屬性
顔色屬性由兩個十六進制數字指定 -- 第一個為背景,第二個則為
前景。每個數字可以為以下任何值之一:
0 = 黑色 8 = 灰色
1 = 藍色 9 = 淡藍色
2 = 綠色 a = 淡綠色
3 = 湖藍色 b = 淡淺綠色
4 = 紅色 c = 淡紅色
5 = 紫色 d = 淡紫色
6 = ××× e = 淡×××
7 = 白色 f = 亮白色
如果沒有給定任何參數,該指令會将顔色還原到 cmd.exe 啟動時
的顔色。這個值來自目前控制台視窗、/t 開關或
defaultcolor 系統資料庫值。
如果用相同的前景和背景顔色來執行 color 指令,color 指令
會将 errorlevel 設定為 1。
例如: "color fc" 在亮白色上産生亮紅色
7、mode 配置系統裝置
配置系統裝置。
串行口: mode comm[:] [baud=b] [parity=p] [data=d] [stop=s]
[to=on|off] [xon=on|off] [odsr=on|off]
[octs=on|off] [dtr=on|off|hs]
[rts=on|off|hs|tg] [idsr=on|off]
裝置狀态: mode [device] [/status]
列印重定向: mode lptn[:]=comm[:]
標明代碼頁: mode con[:] cp select=yyy
代碼頁狀态: mode con[:] cp [/status]
顯示模式: mode con[:] [cols=c] [lines=n]
擊鍵率: mode con[:] [rate=r delay=d]
例:設定dos視窗和顔色
mode con cols=113 lines=15 & color 9f
此指令設定dos視窗大小:15行,113列
8、goto 和 :
goto會點程式設計的朋友就會知道這是跳轉的意思。
在批進行中允許以“:xxx”來建構一個标号,然後用goto xxx跳轉到标号:xxx處,然後執行标号後的指令。
if {%1}=={} goto noparms
if "%2"=="" goto noparms
标簽的名字可以随便起,但是最好是有意義的字元串啦,前加個冒号用來表示這個字元串是标簽,goto指令就是根據這個冒号(:)來尋找下一步跳到到那裡。最好有一些說明這樣你别人看起來才會了解你的意圖啊。
:start
set /a var+=1
echo %var%
if %var% leq 3 goto start
1
2
3
4
休息一下
----------------------------
遭遇失事的外星人
來無影去無蹤的ufo困擾了人類很長時間。可現在人們發現,功能特異的外星人也會有失事的時候。前蘇聯科學家杜朗諾克博士曾透露,1987年11月,一支前蘇聯沙漠考察隊在沙漠裡發現了一個直徑22.87米的碟狀飛行器。飛碟引擎保持完好,裡面有14具已經風幹成木乃伊的外星人遺體。1947年7月6日夜,美國新墨西哥州小鎮羅茲維爾附近風雨大作,電閃雷鳴。第二天天睛後,人們發現了一個圓形的東西躺在草叢裡。駐紮在附近的空軍迅速趕來,封鎖了現場。負責人馬賽爾上尉詳細地檢查了該物體的狀況。它直徑足有10米,分為内、外兩個艙。令他大吃一驚的是,艙内的座椅上竟然有4具類人生物的屍體。它們身高僅有1米左右,皮膚白而細膩,頭很大,鼻子很長,嘴很小。手上隻有4個指頭,指間有蹼相連。它們身穿黑色有金屬光澤的外套,但是質地很柔軟。這一發現震驚了軍方,五角大樓立即下令封鎖消息,但消息靈通的記者已經将此新聞釋出了出去。許多當地人都證明确實有飛碟在羅茲維爾附近墜毀。
————選自《世界未解之謎》
9、find 在檔案中搜尋字元串
在檔案中搜尋字元串。
find [/v] [/c] [/n] [/i] [/off[line]] "string" [[drive:][path]filename[ ...]]
/v 顯示所有未包含指定字元串的行。
/c 僅顯示包含字元串的行數。
/n 顯示行号。
/i 搜尋字元串時忽略大小寫。
/off[line] 不要跳過具有脫機屬性集的檔案。
"string" 指定要搜尋的文字串,
[drive:][path]filename
指定要搜尋的檔案。
如果沒有指定路徑,find 将搜尋鍵入的或者由另一指令産生的文字。
find常和type指令結合使用
type [drive:][path]filename | find "string" [>tmpfile] #挑選包含string的行
type [drive:][path]filename | find /v "string" #剔除檔案中包含string的行
type [drive:][path]filename | find /c #顯示檔案行數
以上用法将去除find指令自帶的提示語(檔案名提示)
echo 111 >test.txt
echo 222 >>test.txt
find "111" test.txt
運作顯示如下:
---------- test.txt
111
type test.txt|find "111"
學習久了,容易瞌睡,清醒清醒,請看:
月球上有轟炸機嗎
1987年3月,前蘇聯的一顆人造衛星拍攝到的月球照片上,出現了一架第二次世界大戰時期的英國轟炸機。這架飛機機身和機翼上有明顯的英國空軍标志,飛機有些地方已被隕石損壞,但機體完整,機身上布滿青苔。它停放在月球的火山口上。照片清晰,令人不容置疑。消息傳出後,立即成為轟動世界的頭号新聞。但是,正當科學家們緊鑼密鼓地展開研究時,1988年7月22日,負責觀察的人報告說:這架轟炸機失蹤,在原來的地方沒有發現它的影子。轟炸機的突然出現,又忽然間消失得無影無蹤,引起了科學家們的種種猜測。有人開始懷疑前蘇聯人造衛星拍到的照片上根本沒有什麼轟炸機,但是拿來照片重新細看,它明明清清楚楚地呈現在人們面前,到底是不是真事?那麼現在它又在哪裡?這給本來就很神秘的這架轟炸機又增添了更為神秘的色彩。
10、start 調用外部程式并任其在新視窗自行運作
批進行中調用外部程式的指令(該外部程式在新視窗中運作,批處理程式繼續往下執行,不理會外部程式的運作狀況),如果直接運作外部程式則必須等外部程式完成後才繼續執行剩下的指令
例:start explorer d:\
調用圖形界面打開d盤
11、assoc 和 ftype
檔案關聯,不常用。
assoc 設定'檔案擴充名'關聯,關聯到'檔案類型'
ftype 設定'檔案類型'關聯,關聯到'執行程式和參數'
當你輕按兩下一個.txt檔案時,windows并不是根據.txt直接判斷用 notepad.exe 打開
而是先判斷.txt屬于 txtfile '檔案類型'
再調用 txtfile 關聯的指令行 txtfile=%systemroot%\system32\notepad.exe %1
可以在"檔案夾選項"→"檔案類型"裡修改這2種關聯
assoc #顯示所有'檔案擴充名'關聯
assoc .txt #顯示.txt代表的'檔案類型',結果顯示 .txt=txtfile
assoc .doc #顯示.doc代表的'檔案類型',結果顯示 .doc=word.document.8
assoc .exe #顯示.exe代表的'檔案類型',結果顯示 .exe=exefile
ftype #顯示所有'檔案類型'關聯
ftype exefile #顯示exefile類型關聯的指令行,結果顯示 exefile="%1" %*
assoc .txt=word.document.8
設定.txt為word類型的文檔,可以看到.txt檔案的圖示都變了
assoc .txt=txtfile
恢複.txt的正确關聯
ftype exefile="%1" %*
恢複 exefile 的正确關聯
如果該關聯已經被破壞,可以運作 command.com ,再輸入這條指令
12、pushd 和 popd
pushd [path | ..] 儲存目前目錄,然後切換到另一個指定的目錄path。
popd 将目前目錄恢複為pushd指令儲存的目錄
c: & cd\ & md mp3 #在 c:\ 建立 mp3 檔案夾
md d:\mp4 #在 d:\ 建立 mp4 檔案夾
cd /d d:\mp4 #更改目前目錄為 d:\mp4,cd指令的/d參數可改變盤符。
pushd c:\mp3 #儲存目前目錄,并切換目前目錄為 c:\mp3
popd #恢複目前目錄為剛才儲存的 d:\mp4
一般用處不大,在目前目錄名不确定時,會有點幫助。(dos程式設計中很有用)
13、call 調用批處理程式或指令并等待其執行完畢
call指令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完後,再繼續執行原來的批處理
call command
調用一條批處理指令,和直接執行指令效果一樣,特殊情況下很有用,比如變量的多級嵌套,見教程後面。在批處理程式設計中,可以根據一定條件生成指令字元串,用call可以執行該字元串,見例子。
call [drive:][path]filename [batch-parameters]
調用的其它批處理程式。filename 參數必須具有 .bat 或 .cmd 擴充名。
call :label arguments
調用本檔案内指令段,相當于子程式。被調用的指令段以标簽:label開頭
以指令goto :eof結尾。
另外,批腳本文本參數參照(%0、%1、等等)已如下改變:
批腳本裡的 %* 指出所有的參數(如 %1 %2 %3 %4 %5 ...)
批參數(%n)的替代已被增強。您可以使用以下文法:(看不明白的直接運作後面的例子)
%~1 - 删除引号("),擴充 %1
%~f1 - 将 %1 擴充到一個完全合格的路徑名
%~d1 - 僅将 %1 擴充到一個驅動器号
%~p1 - 僅将 %1 擴充到一個路徑
%~n1 - 僅将 %1 擴充到一個檔案名
%~x1 - 僅将 %1 擴充到一個檔案擴充名
%~s1 - 擴充的路徑指含有短名
%~a1 - 将 %1 擴充到檔案屬性
%~t1 - 将 %1 擴充到檔案的日期/時間
%~z1 - 将 %1 擴充到檔案的大小
%~$path : 1 - 查找列在 path 環境變量的目錄,并将 %1
擴充到找到的第一個完全合格的名稱。如果環境
變量名未被定義,或者沒有找到檔案,此組合鍵會
擴充到空字元串
可以組合修定符來取得多重結果:
%~dp1 - 隻将 %1 擴充到驅動器号和路徑
%~nx1 - 隻将 %1 擴充到檔案名和擴充名
%~dp$path:1 - 在列在 path 環境變量中的目錄裡查找 %1,
并擴充到找到的第一個檔案的驅動器号和路徑。
%~ftza1 - 将 %1 擴充到類似 dir 的輸出行。
在上面的例子中,%1 和 path 可以被其他有效數值替換。
%~ 文法被一個有效參數号碼終止。%~ 修定符不能跟 %*使用
注意:參數擴充時不理會參數所代表的檔案是否真實存在,均以目前目錄進行擴充
要了解上面的知識,下面的例子很關鍵。
echo 産生一個臨時檔案 > tmp.txt
rem 下行先儲存目前目錄,再将c:\windows設為目前目錄
pushd c:\windows
call :sub tmp.txt
rem 下行恢複前次的目前目錄
popd
del tmp.txt
exit
:sub
echo 删除引号: %~1
echo 擴充到路徑: %~f1
echo 擴充到一個驅動器号: %~d1
echo 擴充到一個路徑: %~p1
echo 擴充到一個檔案名: %~n1
echo 擴充到一個檔案擴充名: %~x1
echo 擴充的路徑指含有短名: %~s1
echo 擴充到檔案屬性: %~a1
echo 擴充到檔案的日期/時間: %~t1
echo 擴充到檔案的大小: %~z1
echo 擴充到驅動器号和路徑:%~dp1
echo 擴充到檔案名和擴充名:%~nx1
echo 擴充到類似 dir 的輸出行:%~ftza1
echo.
goto :eof
set aa=123456
set cmdstr=echo %aa%
echo %cmdstr%
call %cmdstr%
本例中如果不用call,而直接運作%cmdstr%,将顯示結果%aa%,而不是123456
14、shift
更改批處理檔案中可替換參數的位置。
shift [/n]
如果指令擴充名被啟用,shift 指令支援/n 指令行開關;該指令行開關告訴
指令從第 n 個參數開始移位;n 介于零和八之間。例如:
shift /2
會将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影響 %0 和 %1。
枯燥的學習讓人煩躁,休息一下,請看:
----------------
神奇的“海底人”
幾十年來,進階生物在地球各大水域出現的傳聞層出不窮,一些科學家推測,海底可能有高度文明的生物存在,即在海洋深處的某些地方可能生活着一些智力高度發達的生命體——“海底人”。在衆多傳聞之中,最令人驚奇的是1959年初,在波蘭丁尼亞港發現的海底人。當時他正筋疲力盡地走在沙灘上,人們把他送到附近的學校醫院進行治療時,發現這古怪的病人穿着沒有開口的金屬衣裳,此人的手指和腳趾與普通人不同,他的血液循環系統和器官并非人類所有。當人們打算對他進一步研究時,這個怪人突然之間杳如黃鶴,一去不複返。
15、if
if 條件判斷語句,文法格式如下:
if [not] errorlevel number command
if [not] string1==string2 command
if [not] exist filename command
下面逐一介紹,更詳細的分析請看後面章節。
(1) if [not] errorlevel number command
if errorlevel這個句子必須放在某一個指令的後面,執行指令後由if errorlevel 來判斷指令的傳回值。
number的數字取值範圍0~255,判斷時值的排列順序應該由大到小。傳回的值大于等于指定的值時,條件成立
dir c:
rem退出代碼為>=1就跳至标題1處執行,>=0就跳至标題0處執行
if errorlevel 1 goto 1
if errorlevel 0 goto 0
rem 上面的兩行不可交換位置,否則失敗了也顯示成功。
:0
echo 指令執行成功!
rem 程式執行完畢跳至标題exit處退出
goto exit
:1
echo 指令執行失敗!
:exit
運作顯示:指令執行成功!
(2) if [not] string1==string2 command
string1和string2都為字元的資料,英文内字元的大小寫将看作不同,這個條件中的等于号必須是兩個(絕對相等的意思),條件成立即執行後面的command
檢測目前變量的值做出判斷,為了防止字元串中含有空格,可用以下格式
if [not] {string1}=={string2} command
if [not] [string1]==[string2] command
if [not] "string1"=="string2" command
這種寫法實際上将括号或引号當成字元串的一部分了,隻要等号左右兩邊一緻就行了,比如下面的寫法就不行:
if {string1}==[string2] command
(3) if [not] exist filename command
exist filename為檔案或目錄存在的意思
echo off
if exist autoexec.bat echo 檔案存在!
if not exist autoexec.bat echo 檔案不存在!
這個批處理大家可以放在c盤和d盤分别執行,看看效果
16、setlocal 與 變量延遲
本條内容引用[英雄出品]的批處理教程:
要想進階,變量延遲是必過的一關!是以這一部分希望你能認真看。
為了更好的說明問題,我們先引入一個例子。
例1:
@echo off
set a=4
set a=5 & echo %a%
pause
結果:4
解說:為什麼是4而不是5呢?在echo之前明明已經把變量a的值改成5了?
讓我們先了解一下批處理運作指令的機制:
批處理讀取指令時是按行讀取的(另外例如for指令等,其後用一對圓括号閉合的所有語句也當作一行),在讀取某行指令時,如果其中有變量,則變量值應該取上一行的值。是以在讀取指令“set a=5 & echo %a%”時,dos将其預處理為“set a=5 & echo 4”,然後執行。而其中的a=5所做的數值變更,隻能在下一指令行才能展現了。
而為了能夠及時感覺環境變量的動态變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量指派,而會在某個單條語句執行之前再進行指派,也就是說“延遲”了對變量的指派。
那麼如何開啟變量延遲呢?變量延遲又需要注意什麼呢?舉個例子說明一下:
例2:
setlocal enabledelayedexpansion
set a=5 & echo !a!
pause
結果:5
解說:啟動了變量延遲,得到了正确答案。變量延遲的啟動語句是“setlocal enabledelayedexpansion”,并且變量要用一對歎号“!!”括起來(注意要用英文的歎号),否則就沒有變量延遲的效果。
分析一下例2,首先“setlocal enabledelayedexpansion”開啟變量延遲,然後“set a=4”先給變量a指派為4,“set a=5 & echo !a!”這句是給變量a指派為5并輸出(由于啟動了變量延遲,是以批處理能夠感覺到動态變化,即不是先給該行變量指派,而是在運作過程中給變量指派,是以此時a的值就是5了)。
再舉一個例子鞏固一下。
例3:
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
結果:
5
解說:本例開啟了變量延遲并用“!!”将變量擴起來,是以得到我們預期的結果。如果不用變量延遲會出現什麼結果呢?結果是這樣的:
echo 處于關閉狀态。
即沒有感覺到for語句中的動态變化。
提示:在沒有開啟變量延遲的情況下,某條指令行中的變量改變,必須到下一條指令才能展現。這一點也可以加以利用,看例子。
例4:交換兩個變量的值,且不用中間變量
::交換兩個變量的值,但是不使用臨時變量
set var1=abc
set var2=123
echo 交換前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交換後: var1=%var1% var2=%var2%
交換前: var1=abc var2=123
交換後: var1=123 var2=abc
在代碼中,使用 setlocal enabledelayedexpansion 語句來啟用變量延遲之後,有得有失:
優點:
(a)、可以在同一語句内部直接使用上一次改變後的變量;
(b)、在echo特殊字元的時候,無須用引号括起來,比如變量的值含有<、>、|等字元的時候,直接使用 echo !str! 就可以了;
缺點:
(a)、會把文本中所有的感歎号抛棄;
(b)、增加代碼的複雜度,有時容易出錯。
17、attrib 顯示或更改檔案屬性
attrib [+r|-r] [+a|-a] [+s|-s] [+h|-h] [[drive:] [path] filename] [/s [/d]]
+ 設定屬性。
- 清除屬性。
r 隻讀檔案屬性。
a 存檔檔案屬性。
s 系統檔案屬性。
h 隐藏檔案屬性。
[drive:][path][filename]
指定要處理的檔案屬性。
/s 處理目前檔案夾及其子檔案夾中的比對檔案。
/d 也處理檔案夾。
md autorun
attrib +a +s +h autorun
上面的指令将建立檔案夾autorun,然後将其設為存檔、系統、隐藏屬性
18、findstr 在檔案中搜尋字元串(find增強版)
find指令不能處理檔案中超過1024個字元的資料行,此時可用findstr指令。
findstr [/b] [/e] [/l] [/r] [/s] [/i] [/x] [/v] [/n] [/m] [/o] [/f:file]
[/c:string] [/g:file] [/d:dir list] [/a:color attributes] [/off[line]]
strings [[drive:][path]filename[ ...]]
/b 在一行的開始配對模式。
/e 在一行的結尾配對模式。
/l 按字使用搜尋字元串。
/r 将搜尋字元串作為一般表達式使用。
/s 在目前目錄和所有子目錄中搜尋
比對檔案。
/i 指定搜尋不分大小寫。
/x 列印完全比對的行。
/v 隻列印不包含比對的行。
/n 在比對的每行前列印行數。
/m 如果檔案含有比對項,隻列印其檔案名。
/o 在每個比對行前列印字元偏移量。
/p 忽略有不可列印字元的檔案。
/off[line] 不跳過帶有脫機屬性集的檔案。
/a:attr 指定有十六進位數字的顔色屬性。請見 "color /?"
/f:file 從指定檔案讀檔案清單 (/ 代表控制台)。
/c:string 使用指定字元串作為文字搜尋字元串。
/g:file 從指定的檔案獲得搜尋字元串。 (/ 代表控制台)。
/d:dir 查找以分号為分隔符的目錄清單
strings 要查找的文字。
指定要查找的檔案。
除非參數有 /c 字首,請使用空格隔開搜尋字元串。
例如: 'findstr "hello there" x.y' 在檔案 x.y 中尋找 "hello" 或
"there" 。 'findstr /c:"hello there" x.y' 檔案 x.y 尋找
"hello there"。
一般表達式的快速參考:
. 通配符: 任何字元
* 重複: 以前字元或類别出現零或零以上次數
^ 行位置: 行的開始
$ 行位置: 行的終點
[class] 字元類别: 任何在字元集中的字元
[^class] 補字元類别: 任何不在字元集中的字元
[x-y] 範圍: 在指定範圍内的任何字元
\x escape: 元字元 x 的文字用法
\<xyz 字位置: 字的開始
xyz\> 字位置: 字的結束
有關 findstr 常見表達法的詳細情況,請見聯機指令參考。
大自然中的很多神奇現象令人驚歎不已:
神奇的龍卷風
龍卷風外貌奇特,它上部是一塊烏黑或濃灰的積雨雲,下部是下垂着的形如大象鼻子的漏鬥狀雲柱,具有小、快、猛、短的特點。龍卷風通常是極其迅速的,風速一般每秒50米至100米,有時可達每秒300米,甚至超過聲速(340米/秒)。它像一個巨大的吸塵器,經過地面,地面的一切都要被它卷走;經過水庫、河流,常卷起沖天水柱,有時連水庫、河流的底部都露了出來。同時,龍卷風維持時間一般很短,往往隻有幾分鐘或幾十分鐘,最多幾小時,一般移動10米到10千米,便“壽終正寝”了。龍卷風還有一些“古怪行為”,使人難以捉摸。它席卷城鎮,搗毀房屋,把碗櫥從一個地方刮到另一個地方,卻沒有打碎碗櫥裡的一個碗;吓呆了的人們常常被它擡向高空,然後又被它平平安安地送回地面;有時它拔去一隻雞一側的毛,而另一側卻完好無損;它将百年古松吹倒并擰成麻花狀,而近旁的小楊樹連一根枝條都未受到折損。人們對龍卷風的形成及後果進行了多年的研究,但還有很多謎底沒有被揭開。
19、date /t 和 time /t
date /t 直接顯示目前日期,可用來提取或顯示日期。
time /t 直接顯示目前時間,可用來提取或顯示時間。
第二節 常用特殊符号
1、@ 指令行回顯屏蔽符
2、% 批處理變量引導符
3、> 輸出重定向符
4、>> 輸出重定向符
5、<、>&、<& 重定向符
6、| 指令管道符
7、^ 轉義字元
8、& 組合指令(順序執行)
9、&& 組合指令(前面指令成功,才執行後面指令)
10、|| 組合指令(前面指令失敗,才執行後面指令)
11、"" 字元串界定符
12、, 逗号
13、; 分号
14、() 括号
15、! 感歎号
16、批進行中可能會見到的其它特殊标記符: (略)
cr(0d) 指令行結束符
escape(1b) ansi轉義字元引導符
space(20) 常用的參數界定符
tab(09) ; = 不常用的參數界定符
+ copy指令檔案連接配接符
* ? 檔案通配符
/ 參數開關引導符
: 批處理标簽引導符
廢話少說,開講了
1、@ 指令行回顯屏蔽符
這個字元在批進行中的意思是關閉目前行的回顯。我們從前幾課知道
echo off可以關閉掉整個批處理指令的回顯,但不能關掉echo off這個指令,現在我們在echo off這個指令前加個@,就可以達到所有指令均不回顯的要求
2、% 批處理變量引導符
這個百分号嚴格來說是算不上指令的,它隻是批進行中的參數而已(多個%一起使用的情況除外,以後還将詳細介紹)。
引用變量用%var%,調用程式外部參數用%1至%9等等
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %*為指令行傳遞給批處理的參數
%0 批處理檔案本身,包括完整的路徑和擴充名
%1 第一個參數
%9 第九個參數
%* 從第一個參數開始的所有參數
參數%0具有特殊的功能,可以調用批處理自身,以達到批處理本身循環的目的,也可以複制和删除檔案自身等等。
例:最簡單的複制檔案自身的方法
copy %0 d:\wind.bat
小技巧:添加行内注釋
%注釋内容%(可以用作行内注釋,不能出現重定向符号和管道符号)
為什麼這樣呢?此時“注釋内容”其實被當作變量,其值是空的,故隻起注釋作用,不過這種用法容易出現文法錯誤,一般不用。
3、> 輸出重定向符
輸出重定向指令
這個字元的意思是傳遞并且覆寫,他所起的作用是将運作的結果傳遞到後面的範圍(後邊可以是檔案,也可以是預設的系統控制台)
在nt系列指令行中,重定向的作用範圍由整個指令行轉變為單個指令語句,受到了指令分隔符&,&&,||和語句塊的制約限制。
比如:
使用指令:echo hello >1.txt将建立檔案1.txt,内容為”hello “(注意行尾有一空格)
使用指令:echo hello>1.txt将建立檔案1.txt,内容為”hello“(注意行尾沒有空格)
4、>> 輸出重定向符
這個符号的作用和>有點類似,但他們的差別是>>是傳遞并在檔案的末尾追加,而>是覆寫
用法同上
同樣拿1.txt做例子
使用指令:
echo hello > 1.txt
echo world >>1.txt
這時候1.txt 内容如下:
hello
world
5、<、>&、<& 重定向符
這三個指令也是管道指令,但>&、<&一般不常用,你隻需要知道一下就ok了,當然如果想仔細研究的話,可以自己查一下資料。(本人已查過,網上也查不到相關資料)
<,輸入重定向指令,從檔案中讀入指令輸入,而不是從鍵盤中讀入。
echo 2005-05-01>temp.txt
set /p today=<temp.txt
echo %today%
del temp.txt
2005-05-01
>&,将一個句柄的輸出寫入到另一個句柄的輸入中。
<&,剛好和>&相反,從一個句柄讀取輸入并将其寫入到另一個句柄輸出中。
常用句柄:0、1、2,未定義句柄:3—9
1>nul 表示禁止輸出正确的資訊
2>nul 表示禁止輸出錯誤資訊。
其中的1與2都是代表某個資料流輸入輸出的位址(nt cmd 稱之為句柄,msdos稱之為裝置)。
句柄0:标準輸入stdin,鍵盤輸入
句柄1:标準輸出stdout,輸出到指令提示符視窗(console,代碼為con)
句柄2:标準錯誤stderr,輸出到指令提示符視窗(console,代碼為con)
其中的stdin可被<重定向,stdout可被>、>>重定向。
我們已經知道讀取文本中的内容可以用for指令,但如果隻需要讀取第一行用for指令就有點麻煩。簡單的辦法如下:
set /p str=<%0
echo %str%
運作顯示批處理檔案自身的第一行:@echo off