widows批處理精選

DOS批處理高級教程精選合編20080331(windows Xp) 前言 本教程主要引用傷腦筋版主(www.verybat.cn)的系列文章,同時參考引用[英雄]教程等其他批處理教程,本文將這些文章合併在一起,並適當修改,修改整理也是學習過程,力求深刻而又簡單易懂,主要目的是方便自己以後查閱。 本教程很長啊,需要一定的耐心才能看完,能夠看完的話,差不多就是批處理高手了,即使不是高手也是熟手了。如果連續不停的看完本教程而且理解得差不多,估計人也累趴下了。本教程適合對dos有一定基礎的人慢慢學習或查閱。 查閱方法:複製目錄中的條目,搜索即可。 目錄 第一章 批處理基礎 第一節 常用批處理內部命令簡介 1、REM 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系統設備 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 14、shift 15、IF 16、setlocal 與 變量延遲 17、ATTRIB 顯示或更改文件屬性 第二節 常用特殊符號 1、@ 命令行回顯屏蔽符 2、% 批處理變量引導符 3、> 重定向符 4、>> 重定向符 5、<>&、<& 重定向符 6、| 命令管道符 7、^ 轉義字符 8、& 組合命令 9、&& 組合命令 10、|| 組合命令 11、"" 字符串界定符 12、, 逗號 13、; 分號 14、() 括號 15、! 感嘆號 第二章 FOR命令詳解 一、基本格式 二、參數 /d 三、參數 /R 四、參數 /L 五、參數 /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%)的應用技巧 十三、變量嵌套與命令嵌套 全文: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 和 :: 2、ECHO 和 @ 3、PAUSE 4、ERRORLEVEL 5、TITLE 6、COLOR 7、mode 配置系統設備 8、GOTO 和 : 9、FIND 10、START 11、assoc 和 ftype 12、pushd 和 popd 13、CALL 14、shift 15、IF 16、setlocal 與 變量延遲 17、ATTRIB 顯示或更改文件屬性 介紹命令 1、REM 和 :: 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 向自動批處理文件中追加內容 C:>TYPE AUTOEXEC.BAT 顯示該自動批處理文件 @ECHO OFF C:\CPAV\BOOTSAFE (8)向打印機輸出打印內容或打印控制碼 格式:ECHO 打印機控制碼>PRN ECHO 打印內容>PRN 下面的例子是向M-1724打印機輸入打印控制碼。<Alt>156是按住 Alt鍵在小鍵盤鍵入156,類似情況依此類推: C:>ECHO +156+42+116>PRN(輸入下劃線命令FS*t) C:>ECHO +155@>PRN(輸入初始化命令ESC@) C:>ECHO.>PRN(換行) (9)使喇叭鳴響 C:>ECHO ^G “^G”是在 dos 窗口中用 Ctrl+G 或 Alt+007 輸入,輸入多個^G 可以產生多聲鳴響。使用方法是直接將其加入批處理文件中或做成批處理文件調用。 這裏的“^G”屬於特殊符號的使用,請看本文後面的章節 3、PAUSE PAUSE,玩遊戲的人都知道,暫停的意思 在這裏就是停止系統命令的執行並顯示下面的內容。 例: PAUSE 運行顯示: 請按任意鍵繼續. . . 要顯示其他提示語,可以這樣用: Echo 其他提示語 & pause > nul 4、errorlevel 程序返回碼 echo %errorlevel% 每個命令運行結束,可以用這個命令行格式查看返回碼 用於判斷剛纔的命令是否執行成功 默認值爲0,一般命令執行出錯會設 errorlevel 1 5、title 設置cmd窗口的標題 title 新標題 #可以看到cmd窗口的標題欄變了 6、COLOR 設置默認的控制檯前景和背景顏色。 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] 例: 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命令就是根據這個冒號(:)來尋找下一步跳到到那裏。最好有一些說明這樣你別人看起來纔會理解你的意圖啊。 例: @echo off :start set /a var+=1 echo %var% if %var% leq 3 GOTO start pause 運行顯示: 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 off echo 111 >test.txt echo 222 >>test.txt find "111" test.txt del test.txt pause 運行顯示如下: ---------- TEST.TXT 111 請按任意鍵繼續. . . 例: @echo off echo 111 >test.txt echo 222 >>test.txt type test.txt|find "111" del test.txt pause 運行顯示如下: 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 切換當前目錄 @echo off c: & cd\ & md mp3 #在 C:\ 建立 mp3 文件夾 md d:\mp4 #在 D:\ 建立 mp4 文件夾 cd /d d:\mp4 #更改當前目錄爲 d:\mp4 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 off Echo 產生一個臨時文件 > tmp.txt Rem 下行先保存當前目錄,再將c:\windows設爲當前目錄 pushd c:\windows Call :sub tmp.txt Rem 下行恢復前次的當前目錄 Popd Call :sub tmp.txt pause 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% call %cmdstr% pause 本例中如果不用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,判斷時值的排列順序應該由大到小。返回的值大於等於指定的值時,條件成立 例: @echo off 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 命令執行失敗! Rem 程序執行完畢跳至標題exit處退出 goto exit :exit pause 運行顯示:命令執行成功! (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命令等,其後用一對圓括號閉合的所有語句也當作一行),在處理之前要完成必要的預處理工作,這其中就包括對該行命令中的變量賦值。我們現在分析一下例 1,批處理在運行到這句“set a=5 & echo %a%”之前,先把這一句整句讀取並做了預處理——對變量 a 賦了值,那麼%a%當然就是4了!(沒有爲什麼,批處理就是這樣做的。) 而爲了能夠感知環境變量的動態變化,批處理設計了變量延遲。簡單來說,在讀取了一條完整的語句之後,不立即對該行的變量賦值,而會在某個單條語句執行之前再進行賦值,也就是說“延遲”了對變量的賦值。 那麼如何開啓變量延遲呢?變量延遲又需要注意什麼呢?舉個例子說明一下: 例2: @echo off setlocal enabledelayedexpansion set a=4 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: @echo off setlocal enabledelayedexpansion for /l %%i in (1,1,5) do ( set a=%%i echo !a! ) pause 結果: 1 2 3 4 5 解說:本例開啓了變量延遲並用“!!”將變量擴起來,因此得到我們預期的結果。如果不用變量延遲會出現什 麼結果呢?結果是這樣的: ECHO 處於關閉狀態。 ECHO 處於關閉狀態。 ECHO 處於關閉狀態。 ECHO 處於關閉狀態。 ECHO 處於關閉狀態。 即沒有感知到for語句中的動態變化。 提示:在沒有開啓變量延遲的情況下,某條命令行中的變量改變,必須到下一條命令才能體現。這一點也可以加以利用,看例子。 例:交換兩個變量的值,且不用中間變量 @echo off ::目的:交換兩個變量的值,但是不使用臨時變量 ::Code by JM 2007-1-24 CMD@XP ::出處:http://www.cn-dos.net/forum/viewthread.php?tid=27078 set var1=abc set var2=123 echo 交換前: var1=%var1% var2=%var2% set var1=%var2%& set var2=%var1% echo 交換後: var1=%var1% var2=%var2% pause 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,然後將其設爲存檔、系統、隱藏屬性 大自然中的很多神奇現象令人驚歎不已: ---------------------------- 神奇的龍捲風 ---------------------------- 龍捲風外貌奇特,它上部是一塊烏黑或濃灰的積雨雲,下部是下垂着的形如大象鼻子的漏斗狀雲柱,具有小、快、猛、短的特點。龍捲風通常是極其迅速的,風速一般每秒 50 米至 100 米,有時可達每秒 300 米,甚至超過聲速(340米/秒)。它像一個巨大的吸塵器,經過地面,地面的一切都要被它捲走;經過水庫、河流,常捲起沖天水柱,有時連水庫、河流的底部都露了出來。同時,龍捲風維持時間一般很短,往往只有幾分鐘或幾十分鐘,最多幾小時,一般移動10米到 10千米,便“壽終正寢”了。龍捲風還有一些“古怪行爲”,使人難以捉摸。它席捲城鎮,搗毀房屋,把碗櫥從一個地方刮到另一個地方,卻沒有打碎碗櫥裏的一個碗;嚇呆了的人們常常被它擡向高空,然後又被它平平安安地送回地面;有時它拔去一隻雞一側的毛,而另一側卻完好無損;它將百年古鬆吹倒���擰成麻花狀,而近旁的小楊樹連一根枝條都未受到折損。人們對龍捲風的形成及後果進行了多年的研究,但還有很多謎底沒有被揭開。 ————選自《世界未解之謎》 第二節 常用特殊符號 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 off echo 2005-05-01>temp.txt date <temp.txt del temp.txt 這樣就可以不等待輸入直接修改當前日期 >&,將一個句柄的輸出寫入到另一個句柄的輸入中。 <&,剛好和>&相反,從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。 常用句柄: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命令就有點麻煩。簡單的辦法如下: @echo off set /p str=<%0 echo %str% Pause ???運行顯示批處理文件自身的第一行:@echo off ---------------------------- 行蹤詭祕的球狀閃電 ---------------------------- 球狀閃電是一種非常奇特的現象。一般閃電都是呈枝條狀,球狀閃電則呈圓球狀;一般閃電只能存在百分之幾秒,最多不超過幾秒,而球狀閃電卻能存在好幾分鐘;一般閃電有固定的路徑,球狀閃電卻能像幽靈般的四處飄蕩,遊移不定。它到底是怎麼形成的呢?科學界對此尚無定論。球狀閃電的顏色各種各樣,有的橘紅,有的淡紅,有的閃着藍白色的光,有的冒着紫色的火星。它們的行蹤十分詭祕。1984年,一架前蘇聯運輸機與球狀閃電在空中相遇,它竟然能穿透金屬機身來到機艙內,並分裂成兩個半圓形,最後兩個半圓又合而爲一,消失在空氣中。 ————選自《世界未解之謎》 6、| 命令管道符 格式:第一條命令 | 第二條命令 [| 第三條命令...] 將第一條命令的結果作爲第二條命令的參數來使用,記得在unix中這種方式很常見。 例如: dir c:\|find "txt" 以上命令是:查找C:\所有,並發現TXT字符串。 FIND的功能請用 FIND /? 自行查看 在不使format 的自動格式化參數時,我是這樣來自動格式化A盤的 echo y|format a: /s /q /v:system 用過format的都知道,再格盤時要輸入 y來確認是否格盤,這個命令前加上echo y並用|字符來將 echo y的結果傳給format 命令 從而達到自動輸入 y的目的 (這條命令有危害性,測試時請慎重) 7、^ 轉義字符 ^是對特殊符號<,>,&的前導字符,在命令中他將以上 3 個符號的特殊功能去掉,僅僅只把他們當成符號而不使用他們的特殊意義。 比如 echo test ^>1.txt 結果則是:test > 1.txt 他沒有追加在1.txt裏,呵呵。只是顯示了出來 另外,此轉義字符還可以用作續行符號。 舉個簡單的例子: @echo off echo 英雄^ 是^ 好^ 男人 pause 不用多說,自己試一下就明白了。 爲什麼轉義字符放在行尾可以起到續行符的作用呢?原因很簡單,因爲每行末尾還有一個看不見的符號,即回車符,轉義字符位於行尾時就讓回車符失效了,從而起到了續行的作用。 8、& 組合命令 語法:第一條命令 & 第二條命令 [& 第三條命令...] &、&&、||爲組合命令,顧名思義,就是可以把多個命令組合起來當一個命令來執行。這在批處理腳本里是允許的,而且用的非常廣泛。因爲批處理認行不認命令數目。 這個符號允許在一行中使用2個以上不同的命令,當第一個命令執行失敗了,也不影響後邊的命令執行。 這裏&兩邊的命令是順序執行的,從前往後執行。 比如: dir z:\ & dir y:\ & dir c:\ 以上命令會連續顯示z,y,c盤的內容,不理會該盤是否存在 9、&& 組合命令 語法:第一條命令 && 第二條命令 [&& 第三條命令...] 用這種方法可以同時執行多條命令,當碰到執行出錯的命令後將不執行後面的命令,如果一直沒有出錯則一直執行完所有命令 這個命令和上邊的類似,但區別是,第一個命令失敗時,後邊的命令也不會執行 dir z:\ && dir y:\ && dir c:\ 10、|| 組合命令 語法:第一條命令 || 第二條命令 [|| 第三條命令...] 用這種方法可以同時執行多條命令,當一條命令失敗後才執行第二條命令,當碰到執行正確的命令後將不執行後面的命令,如果沒有出現正確的命令則一直執行完所有命令; 提示:組合命令和重定向命令一起使用必須注意優先級 管道命令的優先級高於重定向命令,重定向命令的優先級高於組合命令 問題:把C盤和D盤的文件和文件夾列出到a.txt文件中。看例: dir c:\ && dir d:\ > a.txt 這樣執行後a.txt裏只有D盤的信息!爲什麼?因爲組合命令的優先級沒有重定向命令的優先級高!所以這句在執行時將本行分成這兩部分:dir c:\和dir d:\ > a.txt,而並不是如你想的這兩部分:dir c:\ && dir d:\和 a.txt。要使用組合命令&&達到題目的要求,必須得這麼寫: dir c:\ > a.txt && dir d:\ >> a.txt 這樣,依據優先級高低,DOS將把這句話分成以下兩部分:dir c:\ > a.txt 和dir d:\ >> a.txt。例十八中的幾句的差別比較特殊,值得好好研究體會一下。 當然這裏還可以利用&命令(自己想一下道理哦): dir c:\ > a.txt & dir d:\ >> a.txt ---------------------------- “行爲”古怪的閃電 ---------------------------- 1892 年 7 月 19 日,兩個黑人在美國賓夕法尼亞州被閃電擊斃,當時他們在公園的一棵樹下躲雨。當人們從其中一人的身上脫下衣服時,看見了令人震驚的奇景:死者的前胸留下了閃電發生地點的影像,上邊還有一片略帶棕色的橡樹葉以及藏在草中的羊齒草。樹葉和羊齒草的圖像如此清晰,連肉眼也能看見最細小的筋絡。1957 年,美國一位牧場女工在雷雨中工作。忽然巨雷一響,她雖未被劈死,但感到胸部作痛,解開上衣才發現,竟有一頭牛的影像印在胸前。在俄羅斯,有一個人遭到雷擊後, 全身上下的衣服都不見了,只剩下一隻襯衫的袖子和幾個皮靴上的鐵釘,10分鐘以後,他恢復了知覺,看到自己全身一絲不掛,感到非常奇怪。閃電所造成的這些奇怪現象該如何解釋呢? ————選自《世界未解之謎》 11、"" 字符串界定符 雙引號允許在字符串中包含空格,進入一個特殊目錄可以用如下方法 cd "program files" cd progra~1 cd pro* 以上三種方法都可以進入program files這個目錄 12、, 逗號 逗號相當於空格,在某些情況下“,”可以用來當做空格使 比如 dir,c:\ 13、; 分號 分號,當命令相同時,可以將不同目標用;來隔離,但執行效果不變,如執行過程中發生錯誤,則只返回錯誤報告,但程序仍會執行。(有人說不會繼續執行,其實測試一下就知道了) 比如: dir c:\;d:\;e:\;z:\ 以上命令相當於 dir c:\ dir d:\ dir e:\ dir f:\ 如果其中z盤不存在,運行顯示:系統找不到指定的路徑。然後終止命令的執行。 例:dir c:\;d:\;e:\1.txt 以上命令相當於 dir c:\ dir d:\ dir e:\1.txt 其中文件e:\1.txt不存在,但 e盤存在,有錯誤提示,但命令仍會執行。 爲什麼?如果目標路徑不存在,則終止執行;如果路徑存在,僅文件不存在,則繼續執行。 就說這些了!各位有什麼意見請回貼!有什麼疑問請到BAT 交流區發貼!下一節改進! 14、() 括號 小括號在批處理編程中有特殊的作用,左右括號必須成對使用,括號中可以包括多行命令,這些命令將被看成一個整體,視爲一條命令行。 括號在 for 語句和 if 語句中常見,用來嵌套使用循環或條件語句,其實括號()也可以單獨使用,請看例子。 例: 命令:echo 1 & echo 2 & echo 3 可以寫成: ( echo 1 echo 2 echo 3 ) 上面兩種寫法效果一樣,這兩種寫法都被視爲是一條命令行。 注意:這種多條命令被視爲一條命令行時,如果其中有變量,就涉及到變量延遲的問題。 15、! 感嘆號 沒啥說的,在變量延遲問題中,用來表示變量,即%var%應該表示爲!var!,請看前面的setlocal命令介紹。 累了,換換思維,有興趣的可以學一段古文化:《三字經》第一節,可謂人人皆知。 【原文】 人(rén) 之(zhī) 初(chū),性(xìng) 本(běn) 善(shàn), 性(xìng) 相(xiāng) 近(jìn),習(xí) 相(xiāng) 遠(yuǎn)。 苟(gǒu) 不(bú) 教(jiào),性(xìng) 乃(nǎi) 遷(qiān), 教(jiào) 之(zhī) 道(dào),貴(guì) 以(yǐ) 專(zhuān)。 【譯文參考】 人剛生下來的時候,本性中有善的一面。這時候善良的本性,大致都很相近,沒有多大的差別。等到長大以後,因各人的環境不同,所學習的也不同;在好的環境人就會變好,在不好的環境人就容易學壞,於是性情開始有了差別。假如在這個時候,不給他適當的教導,學了種種不良的習慣,他原本善良的本性,就會漸漸變壞;而教導的方法,最重要的就是必須專心一致,不可邊做邊停,才能使他有完整的學習。 第二章 DOS 循環:for命令詳解 講FOR之前呢,咋先告訴各位新手朋友,如果你有什麼命令不懂,直接在CMD下面輸入: name /? 這樣的格式來看系統給出的幫助文件,比如for /? 就會把FOR命令的幫助全部顯示出來!當然許多菜鳥都看不懂....所以纔會有那麼多批處理文章!!!!俺也照顧菜鳥,把FOR命令用我自己的方式說明下! 正式開始: 一、基本格式 FOR %%variable IN (set) DO command [command-parameters] %%variable 指定一個單一字母表示可替換的參數。 (set) 指定一個或一組文件。可以使用通配符。 command 指定對每個文件執行的命令。 command-parameters 爲特定命令指定參數或命令行開關。 參數:FOR有4 個參數 /d /l /r /f 他們的作用我在下面用例子解釋 現在開始講每個參數的意思 二、參數 /d FOR /D %%variable IN (set) DO command [command-parameters] 如果集中包含通配符,則指定與目錄名匹配,而不與文件 名匹配。 如果 Set (也就是我上面寫的 "相關文件或命令") 包含通配符(*?),將對與 Set 相匹配的每個目錄(而不是指定目錄中的文件組)執行指定的 Command。 這個參數主要用於目錄搜索,不會搜索文件,看這樣的例子 @echo off for /d %%i in (c:\*) do echo %%i pause 運行會把C盤根目錄下的全部目錄名字打印出來,而文件名字一個也不顯示! 在來一個,比如我們要把當前路徑下文件夾的名字只有1-3個字母的打出來 @echo off for /d %%i in (???) do echo %%i pause 這樣的話如果你當前目錄下有目錄名字只有1-3個字母的,就會顯示出來,沒有就不顯示了 這裏解釋下*號和?號的作用,*號表示任意N 個字符,而?號只表示任意一個字符 知道作用了,給大家個思考題目! @echo off for /d %%i in (window?) do echo %%i pause 保存到C盤下執行,會顯示什麼呢?自己看吧! 顯示:windows /D參數只能顯示當前目錄下的目錄名字,這個大家要注意! 三、參數 /R FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters] 檢查以 [drive:]path 爲根的目錄樹,指向每個目錄中的 FOR 語句。如果在 /R 後沒有指定目錄,則使用當前 目錄。如果集僅爲一個單點(.)字符,則枚舉該目錄樹。 遞歸 上面我們知道,/D 只能顯示當前路徑下的目錄名字,那麼現在這個/R 也是和目錄有關,他能幹嘛呢?放心他比/D強大多了! 他可以把當前或者你指定路徑下的文件名字全部讀取,注意是文件名字,有什麼用看例子! 請注意2點: 1、set 中的文件名如果含有通配符(?或*),則列舉/R 參數指定的目錄及其下面的所用子目錄中與 set相符合的所有文件,無相符文件的目錄則不列舉。 2、相反,如果 set 中爲具體文件名,不含通配符,則枚舉該目錄樹(即列舉該目錄及其下面的所有子目錄),而不管 set 中的指定文件是否存在。這與前面所說的單點(.)枚舉目錄樹是一個道理,單點代表當前目錄,也可視爲一個文件。 例: @echo off for /r c:\ %%i in (*.exe) do echo %%i pause 咱們把這個 BAT 保存到 D 盤隨便哪裏然後執行,我會就會看到,他把 C 盤根目錄,和每個目錄的子目錄下面全部的EXE文件都列出來了!!!! 例: @echo off for /r %%i in (*.exe) do @echo %%i pause 參數不一樣了吧!這個命令前面沒加那個 C:\也就是搜索路徑,這樣他就會以當前目錄爲搜索路徑,比如你這 BAT 你把他放在 d:\test 目錄下執行,那麼他就會把 D:\test 目錄和他下面的子目錄的全部 EXE 文件列出!!! 例: @echo off for /r c:\ %%i in (boot.ini) do echo %%i pause 運行本例發現枚舉了c盤所有目錄,爲了只列舉boot.ini 存在的目錄,可改成下面這樣: @echo off for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i pause 用這條命令搜索文件真不錯。。。。。。 這個參數大家應該理解了吧!還是滿好玩的命令! 四、參數 /L FOR /L %%variable IN (start,step,end) DO command [command-parameters] 該集表示以增量形式從開始到結束的一個數字序列。 因此,(1,1,5) 將產生序列 1 2 3 4 5,(5,-1,1) 將產生 序列 (5 4 3 2 1)。 使用迭代變量設置起始值 (Start#),然後逐步執行一組範圍的值,直到該值超過所設置的終止值 (End#)。/L 將通過對 Start# 與 End# 進行比較來執行迭代變量。如果 Start# 小於 End#,就會執行該命令。如果迭代變量超過 End#,則命令解釋程序退出此循環。還可以使用負的 Step# 以遞減數值的方式逐步執行此範圍內的值。例如,(1,1,5) 生成序列 1 2 3 4 5,而 (5,-1,1) 則生成序列 (5 4 3 2 1)。語法是: 看着這說明有點暈吧!咱們看例子就不暈了! @echo off for /l %%i in (1,1,5) do @echo %%i pause 保存執行看效果,他會打印從1 2 3 4 5 這樣5個數字 (1,1,5)這個參數也就是表示從1開始每次加1直到 5終止! 等會暈,就打印個數字有P用...好的滿足大家,看這個例子 @echo off for /l %%i in (1,1,5) do start cmd pause 執行後是不是嚇了一跳,怎麼多了 5 個 CMD 窗口,呵呵!如果把那個 (1,1,5)改成 (1,1,65535)會有什麼結果,我先告訴大家,會打開65535 個CMD窗口....這麼多你不死機算你強! 當然我們也可以把那個start cmd改成md %%i 這樣就會建立指定個目錄了!!!名字爲 1-65535 看完這個被我賦予破壞性質的參數後,我們來看最後一個參數 ---------------------------- 三葉蟲化石 ---------------------------- 1968年,一個三葉蟲化石的收藏家在猶他州旅行時,發現了讓他驚喜不已的三葉蟲化石。我們知道,三葉蟲是一種生存在 5 億年前的小生物。可他回家後,竟在這個化石上看見了人類的腳印,那是一個穿着涼鞋的腳印,不偏不倚正好踩在三葉蟲上。它不會是人爲的惡作劇吧?開始也有人是這麼想的,但是如果要製作這些腳印並把它們刻在石頭上,再埋在深深的土層裏,還要做到不留痕跡,這似乎完全沒有可能。而且就在這之後,又先後有人在同一地區發現了類似的多處腳印,要僞造這麼多腳印且都做到人不知鬼不覺是不可能的,可惜的是人們依然無法確定這些鞋印是怎麼回事。按照達爾文進化論,在遙遠的 5 億年前,連人類的近親猩猩、猴子都沒有,誰會穿着涼鞋在這一帶溜達呢? ————選自《世界未解之謎》 五、參數 /F \迭代及文件解析 使用文件解析來處理命令輸出、字符串及文件內容。使用迭代變量定義要檢查的內容或字符串,並使用各種options選項進一步修改解析方式。使用options令牌選項指定哪些令牌應該作爲迭代變量傳遞。請注意:在沒有使用令牌選項時,/F 將只檢查第一個令牌。 文件解析過程包括讀取輸出、字符串或文件內容,將其分成獨立的文本行以及再將每行解析成零個或更多個令牌。然後通過設置爲令牌的迭代變量值,調用 for 循環。默認情況下,/F 傳遞每個文件每一行的第一個空白分隔符號。跳過空行。 詳細的幫助格式爲: FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters] FOR /F ["options"] %%variable IN ("string") DO command [command-parameters] FOR /F ["options"] %%variable IN ('command') DO command [command-parameters] 帶引號的字符串"options"包括一個或多個 指定不同解析選項的關鍵字。這些關鍵字爲: eol=c - 指一個行註釋字符的結尾(就一個) skip=n - 指在文件開始時忽略的行數。 delims=xxx - 指分隔符集。這個替換了空格和跳格鍵的 默認分隔符集。 tokens=x,y,m-n - 指每行的哪一個符號被傳遞到每個迭代 for 本身。這會導致額外變量名稱的分配。m-n 格式爲一個範圍。通過 nth 符號指定 mth。如果 符號字符串中的最後一個字符星號, 那麼額外的變量將在最後一個符號解析之後 分配並接受行的保留文本。經測試,該參數最多 只能區分31 個字段。 usebackq - 使用後引號(鍵盤上數字1左面的那個鍵`)。 未使用參數usebackq時:file-set 表示文件,但不能含有空格 雙引號表示字符串,即"string" 單引號表示執行命令,即'command' 使用參數usebackq時:file-set和"file-set"都表示文件 當文件路徑或名稱中有空格時,就可以用雙引號括起來 單引號表示字符串,即'string' 後引號表示命令執行,即`command` 以上是用for /?命令獲得的幫助信息,直接複製過來的。 暈慘了!我這就舉個例子幫助大家來理解這些參數! For命令例1:**************************************** @echo off rem 首先建立臨時文件test.txt echo ;註釋行,這是臨時文件,用完刪除 >test.txt echo 11段 12 段 13段 14段 15段 16段 >>test.txt echo 21段,22 段,23段,24段,25段,26段 >>test.txt echo 31段-32 段-33段-34段-35段-36段 >>test.txt FOR /F "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k Pause Del test.txt 運行顯示結果: 11段 13段 14段 15段 16 段 21段 23段 24段,25段,26 段 31段 33段 34段-35段-36 段 請按任意鍵繼續. . . 爲什麼會這樣?我來解釋: eol=; 分號開頭的行爲註釋行 tokens=1,3* 將每行第1段,第3段和剩餘字段分別賦予變量%%i%%j%%k delims=,- (減號後有一空格)以逗號減號和空格爲分隔符,空格必須放在最後 For命令例2:**************************************** @echo off FOR /F "eol= delims=" %%i in (test.txt) do echo %%i Pause 運行將顯示test.txt全部內容,包括註釋行,不解釋了哈。 For命令例3:**************************************** 另外/F參數還可以以輸出命令的結果看這個例子 @echo off FOR /F "delims=" %%i in ('net user') do @echo %%i pause 這樣你本機全部帳號名字就出來了把擴號內的內容用兩個單引號引起來就表示那個當命令執行,FOR 會返回命令的每行結果,加那個"delims=" 是爲了讓我空格的行能整行顯示出來,不加就只顯示空格左邊一列! 基本上講完了 FOR 的基本用法了...如果你看過 FOR 的系統幫助,你會發現他下面還有一些特定義的變量,這些我先不講.大家因該都累了吧!你不累我累啊.... 所謂文武之道,一張一弛,現休息一下。 第三章 FOR命令中的變量 FOR命令中有一些變量,他們的用法許多新手朋友還不太瞭解,今天給大家講解他們的用法! 先把FOR的變量全部列出來: ~I - 刪除任何引號("),擴展 %I %~fI - 將 %I 擴展到一個完全合格的路徑名 %~dI - 僅將 %I 擴展到一個驅動器號 %~pI - 僅將 %I 擴展到一個路徑 %~nI - 僅將 %I 擴展到一個文件名 %~xI - 僅將 %I 擴展到一個文件擴展名 %~sI - 擴展的路徑只含有短名 %~aI - 將 %I 擴展到文件的文件屬性 %~tI - 將 %I 擴展到文件的日期/時間 %~zI - 將 %I 擴展到文件的大小 %~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴展 到找到的第一個完全合格的名稱。如果環境變量名 未被定義,或者沒有找到文件,此組合鍵會擴展到 空字符串 我們可以看到每行都有一個大寫字母"I",這個I其實就是我們在FOR帶入的變量,我們FOR語句代入的變量名是什麼,這裏就寫什麼. 比如:FOR /F %%z IN ('set') DO @echo %%z 這裏我們代入的變量名是z 那麼我們就要把那個I改成z,例如%~fI改爲%~fz 至於前面的%~p這樣的內容就是語法了! 好開始講解: 一、 ~I - 刪除任何引號("),擴展 %I 這個變量的作用就如他的說明,刪除引號! 我們來看這個例子: 首先建立臨時文件temp.txt,內容如下 "1111 "2222" 3333" "4444"44 "55"55"55 可建立個BAT 文件代碼如下: @echo off echo ^"1111>temp.txt echo "2222">>temp.txt echo 3333^">>temp.txt echo "4444"44>>temp.txt echo ^"55"55"55>>temp.txt rem 上面建立臨時文件,注意不成對的引號要加轉義字符^,重定向符號前不要留空格 FOR /F "delims=" %%i IN (temp.txt) DO echo %%~i pause del temp.txt 執行後,我們看CMD的回顯如下: 1111 #字符串前的引號被刪除了 2222 #字符串首尾的引號都被刪除了 3333" #字符串前無引號,後面的引號保留 4444"44 #字符串前面的引號刪除了,而中間的引號保留 55"55"55 #字符串前面的引號刪除了,而中間的引號保留 請按任意鍵繼續. . . 和之前temp.txt中的內容對比一下,我們會發現第1、2、5 行的引號都消失了,這就是刪除引號~i的作用了! 刪除引號規則如下(BAT 兄補充!) 1、若字符串首尾同時存在引號,則刪除首尾的引號; 2、若字符串尾不存在引號,則刪除字符串首的引號; 3、如果字符串中間存在引號,或者只在尾部存在引號,則不刪除。 龍捲風補充:無頭不刪,有頭連尾刪。 二、 %~fI - 將 %I 擴展到一個完全合格的路徑名 看例子: 把代碼保存放在隨便哪個地方,我這裏就放桌面吧. FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi pause 執行後顯示內容如下 C:\Documents and Settings\Administrator\桌面\test.bat C:\Documents and Settings\Administrator\桌面\test.vbs 當我把代碼中的 %%~fi直接改成%%i FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i pause 執行後就會顯示以下內容: test.bat test.vbs 通過對比,我們很容易就看出沒有路徑了,這就是"將 %I 擴展到一個完全合格的路徑名"的作用 也就是如果%i 變量的內容是一個文件名的話,他就會把這個文件所在的絕對路徑打印出來,而不只單單打印一個文件名,自己動手動實驗下就知道了! 三、 %~dI - 僅將 %I 擴展到一個驅動器號 看例子: 代碼如下,我還是放到桌面執行! FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di pause 執行後我CMD 裏顯示如下 C: C: 我桌面就兩個文件 test.bat,test.vbs,%%~di 作用是,如果變量%%i 的內容是一個文件或者目錄名,他就會把他這文件 或者目錄所在的盤符號打印出來! 四、 %~pI - 僅將 %I 擴展到一個路徑 這個用法和上面一樣,他只打印路徑不打印文件名字 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi pause 我就不打結果了,大家自己複製代碼看結果吧,下面幾個都是這麼個用法,代碼給出來,大家自己看結果吧! 五、 %~nI - 僅將 %I 擴展到一個文件名 只打印文件名字 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni pause 六、 %~xI - 僅將 %I 擴展到一個文件擴展名 只打印文件的擴展名 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi pause 七、 %~sI - 擴展的路徑只含有短名 打印絕對短文件名 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si pause 八、 %~aI - 將 %I 擴展到文件的文件屬性 打印文件的屬性 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai pause 九、 %~tI - 將 %I 擴展到文件的日期/時間 打印文件建立的日期 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti pause 十、 %~zI - 將 %I 擴展到文件的大小 打印文件的大小 FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi pause 上面例子中的"delims=="可以改爲"delims=",即不要分隔符 十一、 %~$PATH:I - 查找列在路徑環境變量的目錄,並將 %I 擴展 到找到的第一個完全合格的名稱。如果環境變量名 未被定義,或者沒有找到文件,此組合鍵會擴展到 空字符串 這是最後一個,和上面那些都不一樣,我單獨說說! 然後在把這些代碼保存爲批處理,放在桌面。 @echo off FOR /F "delims=" %%i IN (“notepad.exe”) DO echo %%~$PATH:i pause 龍捲風補充:上面代碼顯示結果爲C:\WINDOWS\system32\notepad.exe 他的意思就在PATH變量裏指定的路徑裏搜索notepad.exe文件,如果有notepad.exe則會把他所在絕對路徑打印出來,沒有就打印一個錯誤! 好了,FOR的的變量就介紹到這了! BY 傷腦筋 好了,理科學習告一段落,請欣賞《千字文》第一節: 【原文】 天(tiān) 地(dì) 玄(xuán) 黃(huáng) , 宇(yǔ) 宙(zhòu) 洪(hóng) 荒(huāng) 。 日(rì) 月(yuè) 盈(yíng) 昃(zè) , 辰(chén) 宿(xiù) 列(liè) 張(zhāng) 。 (1)玄黃:形容在遠古地球剛誕生時的景象,新的天體正在組成,天地之間一片渾沌熾熱。天空因大氣燃燒而赤黑又變化莫測,所以稱之爲“天玄”。大地因燃燒而變得焦黃,所以稱之爲“地黃”。玄,黑中帶紅的顏色,後來多指黑色;深遠莫測的。黃,黃色,與紅、藍合稱三原色。出自於《易經》:夫玄黃者,天地之雜也,天玄而地黃。 (2)宇宙:時空的總合。宇,上下四方無限廣大的空間。宙,古往今來無限久遠的時間。出自於《淮南子》:上下四方叫作宇,古往今來叫作宙。 (3)洪荒:遠古時期地球有很大的面積以及很長一段時間被洪水所淹沒,到處顯得荒蕪淒涼。洪,大;大水。荒,雜草叢生。出自於西漢? 楊雄《太玄經》:洪荒之世。 (4)盈:充滿,此指月圓。月亮盈虧的變化,陰曆每月十五日是滿月,又稱望月、盈月;三十日月盡,沒有月光。 (5)昃:傾斜,指太陽西斜。太陽每天東昇西落,早上從東邊升起,正午時位置最高,過了正午向西邊斜落。 (6)辰宿:星辰。辰:星體的總稱。宿:星羣、星座。單顆星體稱星,一顆以上稱宿。 (7)列張:陳列分佈。列,陳列。張,分佈。出自《淮南子》:天設日月,列星辰,調陰陽,張四時。 【譯文參考】 在地球剛誕生的時候,地球的四周被渾沌不清、變幻莫測的赤黑色氣體所包圍,而大地則是枯黃的一片。到處都是大水,舉目所見一片荒涼。 經過很長的一段時間後,天地之間慢慢澄清了,這時可以看到太陽、月亮很有規律的在天空中運行着,日出日落,月圓月缺。在無邊無際的天空中佈滿了大大小小的星星。 第四章 批處理中的變量 批處理中的變量,我把他分爲兩類,分別爲"系統變量"和"自定義變量" 我們現在來詳解這兩個變量! 一、系統變量 他們的值由系統將其根據事先定義的條件自動賦值,也就是這些變量系統已經給他們定義了值, 不需要我們來給他賦值,我們只需要調用而以! 我把他們全部列出來! %ALLUSERSPROFILE% 本地 返回“所有用戶”配置文件的位置。 %APPDATA% 本地 返回默認情況下應用程序存儲數據的位置。 %CD% 本地 返回當前目錄字符串。 %CMDCMDLINE% 本地 返回用來啓動當前的 Cmd.exe 的準確命令行。 %CMDEXTVERSION% 系統 返回當前的“命令處理程序擴展”的版本號。 %COMPUTERNAME% 系統 返回計算機的名稱。 %COMSPEC% 系統 返回命令行解釋器可執行程序的準確路徑。 %DATE% 系統 返回當前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關 date 命令的詳細信息,請參閱 Date。 %ERRORLEVEL% 系統 返回上一條命令的錯誤代碼。通常用非零值表示錯誤。 %HOMEDRIVE% 系統 返回連接到用戶主目錄的本地工作站驅動器號。基於主目錄值而設置。用 戶主目錄是在“本地用戶和組”中指定的。 %HOMEPATH% 系統 返回用戶主目錄的完整路徑。基於主目錄值而設置。用戶主目錄是在“本地用戶和組”中指定的。 %HOMESHARE% 系統 返回用戶的共享主目錄的網絡路徑。基於主目錄值而設置。用戶主目錄是 在“本地用戶和組”中指定的。 %LOGONSERVER% 本地 返回驗證當前登錄會話的域控制器的名稱。 %NUMBER_OF_PROCESSORS% 系統 指定安裝在計算機上的處理器的數目。 %OS% 系統 返回操作系統名稱。Windows 2000 顯示其操作系統爲 Windows_NT。 %PATH% 系統 指定可執行文件的搜索路徑。 %PATHEXT% 系統 返回操作系統認爲可執行的文件擴展名的列表。 %PROCESSOR_ARCHITECTURE% 系統 返回處理器的芯片體系結構。值:x86 或 IA64 基於 Itanium %PROCESSOR_IDENTFIER% 系統 返回處理器說明。 %PROCESSOR_LEVEL% 系統 返回計算機上安裝的處理器的型號。 %PROCESSOR_REVISION% 系統 返回處理器的版本號。 %PROMPT% 本地 返回當前解釋程序的命令提示符設置。由 Cmd.exe 生成。 %RANDOM% 系統 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。 %SYSTEMDRIVE% 系統 返回包含 Windows server operating system 根目錄(即系統根目錄) 的驅動器。 %SYSTEMROOT% 系統 返回 Windows server operating system 根目錄的位置。 %TEMP%%TMP% 系統和用戶 返回對當前登錄用戶可用的應用程序所使用的默認臨時目錄。 有些應用程序需要 TEMP,而其他應用程序則需要 TMP。 %TIME% 系統 返回當前時間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關 time 命令的詳細信息,請參閱 Time。 %USERDOMAIN% 本地 返回包含用戶帳戶的域的名稱。 %USERNAME% 本地 返回當前登錄的用戶的名稱。 %USERPROFILE% 本地 返回當前用戶的配置文件的位置。 %WINDIR% 系統 返回操作系統目錄的位置。 這麼多系統變量,我們如何知道他的值是什麼呢? 在CMD裏輸入 echo %WINDIR% 這樣就能顯示一個變量的值了! 舉個實際例子,比如我們要複製文件到當前帳號的啓動目錄裏就可以這樣 copy d:\1.bat "%USERPROFILE%\「開始」菜單\程序\啓動\" %USERNAME% 本地 返回當前登錄的用戶的名稱。 注意有空格的目錄要用引號引起來 另外還有一些系統變量,他們是代表一個意思,或者一個操作! 他們分別是%0 %1 %2 %3 %4 %5 ......一直到%9 還有一個%* %0 這個有點特殊,有幾層意思,先講%1-%9的意思. %1 返回批處理的第一個參數 %2 返回批處理的第二個參數 %3-%9依此推類 反回批處理參數?到底怎麼個返回法? 我們看這個例子,把下面的代碼保存爲test.BAT 然後放到C盤下 @echo off echo %1 %2 %3 %4 echo %1 echo %2 echo %3 echo %4 進入CMD,輸入cd c:\ 然後輸入 test.bat 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數 注意中間的空格,我們會看到這樣的結果: 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數 對比下代碼,%1就是”我是第一個參數” %2 就是”我是第二個參數” 怎麼樣理解了吧! 這些%1和%9 可以讓批處理也能帶參數運行,大大提高批處理功能! 還有一個%* 他是什麼呢?他的作用不是很大,只是返回參數而已,不過他是一次返回全部參數的值,不用在輸入%1 %2來確定一個個的 例子 @echo off echo %* 同樣保存爲test.bat 放到C盤 進入CMD,輸入cd c:\ 然後輸入 test.bat 我是第一個參數 我是第二個參數 我是第三個參數 我是第四個參數 可以看到他一次把全部參數都顯示出來了 好現在開始講那個比較特殊的%0 %0 這個不是返回參數的值了,他有兩層意思! 第一層意思:返回批處理所在絕對路徑 例子: @echo off echo %0 pause 保存爲test.BAT 放在桌面運行,會顯示如下結果 "C:\Documents and Settings\Administrator\桌面\test.bat" 他把當前批處理執行的所在路經打印出來了,這就是返回批處理所在絕對路徑的意思 第二層意思:無限循環執行BAT 例子: @echo off net user %0 保存爲BAT 執行,他就會無限循環執行net user這條命令,直到你手動停止. 龍捲風補充:其實%0就是第一參數%1前面那個參數,當然就是批處理文件名(包括路徑)。 以上就是批處理中的一些系統變量,另外還有一些變量,他們也表示一些功能, FOR命令中的那些就是,FOR變量已經說過,就不講了. 二、自定義變量 故名思意,自定義變量就是由我們來給他賦予值的變量 要使用自定義變量就得使用set命令了,看例子. @echo off set var=我是值 echo %var% pause 保存爲BAT 執行,我們會看到CMD裏返回一個 "我是值" var爲變量名,=號右變的是要給變量的值 這就是最簡單的一種設置變量的方法了 如果我們想讓用戶手工輸入變量的值,而不是在代碼裏指定,可以用用set命令的/p參數 例子: @echo off set /p var=請輸入變量的值 echo %var% pause var變量名 =號右邊的是提示語,不是變量的值 變量的值由我們運行後自己用鍵盤輸入! 第五章 set命令詳解 很久沒發貼了,今天來寫點講BAT 的新手教學貼! 在上一貼中我簡單的介紹了一下SET 設置自定義變量的作用,現在我來具體講一下set的其他功能. 一、用set命令設置自定義變量 顯示、設置或刪除 cmd.exe 環境變量。 SET [variable=[string]] variable 指定環境變量名。 string 指定要指派給變量的一系列字符串。 要顯示當前環境變量,鍵入不帶參數的 SET。 SET 命令不允許變量名含有等號。 注意:以下用法將清除變量variable的值,使其變成未定義狀態。 SET variable= 上面等號後面無任何符號,如果寫成SET variable="",此時變量值並不爲空,而是等於兩個引號,即"" 例子: @echo off set var=我是值 echo %var% pause 請看 set var=我是值 ,這就是BAT 直接在批處理中設置變量的方法! set 是命令 var是變量名 =號右邊的"我是值"是變量的值 在批處理中我們要引用這個變就把var變量名用兩個%(百分號)擴起來,如%var% SET 還可以提供一個交互界面,讓用戶自己輸入變量的值,然後我們在來根據這個值來做相應操作,現在我就來說說SET 的這種語法,只需要加一個"/P"參數就可以了! SET /P variable=[promptString] 例子: @echo off set /p var=請輸入變量的值: echo 您輸入了 %var% ~_~ pause set /p 是命令語法 var是變量名 =號右邊的"請輸入變量的值: ",這個是提示語,不是變量的值了! 運行後,我們在提示語後面直接輸入1,就會顯示一行您輸入了 1 ~_~ 好了,先回顧到這,現在講SET其他功能 使用set /?查看SET 的幫助我們發現SET 除了我上面講的 SET [variable=[string]] SET /P variable=[promptString] 這兩種語法外,還有如下幾種語法: SET /A expression 環境變量替換已如下增強: %PATH:str1=str2% %PATH:~10,5% %PATH:~-10% %PATH:~0,-2% 這機種語法有什麼用處呢?下面我們來一個個講解他們! 二、用set命令進行簡單計算 語法:SET /A expression /A 命令行開關指定等號右邊的字符串爲被評估的數字表達式。該表達式 評估器很簡單並以遞減的優先權順序支持下列操作: () -分組 ! ~ - -一元運算符 * / % -算數運算符 + - -算數運算符 << >> -二進制邏輯移位 & -二進制按位“與” ^ -二進制按位“異” | -二進制按位“或” = *= /= %= += -= -算數賦值 &= ^= |= <<= >>= -二進制運算賦值 , -表達式分隔符 如果 SET /A 在命令腳本外的命令行執行的,那麼它顯示該表達式的最後值。 除十六進制有 0x 前綴, 八進制有 0 前綴的,數字值爲十進位數字。 因此, 0x12 與 18 和 022 相同。請注意八進制公式可能很容易搞混: 08 和 09 是無效的數字,因爲 8 和 9 不是有效的八進制位數。 上面這些是系統幫助裏的內容,看着是不是有點暈,沒關係我來簡單解釋一下: set的/A參數就是讓SET 可以支持數學符號進行加減等一些數學運算! 注意:一般的運算常爲十進制運算,如果數字字符串最左邊爲 0,將被認爲是八進制,從而出錯。比如,0812之類的數字不能參與十進制運算,轉換方法爲:10812-10000 例: set aa=0812 set /a aa=1%aa%-10000 echo %aa% 結果爲:812 例: @echo off set /p input=請輸入計算表達式: set /a var=%input% echo 計算結果:%input%=%var% pause 上面的例子是龍捲風設計的,很好用喲,請看下面幾個運算過程: 注意:DOS計算只能進行整數運算,精確到整數 請輸入計算表達式:1+9+20+30-10 計算結果:1+9+20+30-10=50 請按任意鍵繼續. . . 請輸入計算表達式:10/3 #除法只能精確到整數 計算結果:10/3=3 請按任意鍵繼續. . . 請輸入計算表達式:-100+62 #負數 計算結果:-100+62=-38 請按任意鍵繼續. . . 請輸入計算表達式:100%3 #求餘數 計算結果:100%3=1 請按任意鍵繼續. . . 注意:以上的求餘數運算符%在批處理程序中必須寫成%% 請輸入計算表達式:(25+75)*2/(15+5) #括號 計算結果:(25+75)*2/(15+5)=10 請按任意鍵繼續. . . 請輸入計算表達式:1234567890*9876543210 #範圍 無效數字。數字精確度限爲 32 位。 計算結果:1234567890*9876543210= 請按任意鍵繼續. . . 注意:上面的計算過程顯示,DOS計算只能精確到32位,這個32位是指二進制32位,其中最高位爲符號位(0 爲正,1 爲負),低位 31 位爲數值。31 個 1 換成十進制爲 2147483647,所以 DOS 計算的有效值範圍是-2147483648 至2147483647,超出該數值範圍時計算出錯,請看下面的計算過程: 請輸入計算表達式:2147483647-1 #最大值減1,值有效 計算結果:2147483647-1=2147483646 請按任意鍵繼續. . . 請輸入計算表達式:2147483647+1 #最大值加1,出錯,結果爲最小值 計算結果:2147483647+1=-2147483648 請按任意鍵繼續. . . 請輸入計算表達式:-2147483648-1 #最小值減1,出錯,結果爲最大值 計算結果:-2147483648-1=2147483647 請按任意鍵繼續. . . 運行set /a a=1+1,b=2+1,c=3+1後會顯示一個4,但我們用 echo %a% %b% %c%後看結果,會發現其他數學運算也有效果!,這就是表達式分隔符"逗"號的 作用! 有時候我們需要直接在原變量進行加減操作就可以用這種語法 set /a var+=1 這樣的語法對應原始語法就是set /a var = %var% + 1 都是一樣的結果,在原變量的值上在進行數學運算,不過這樣寫簡單一點 再來一個: set /a var*=2 其他都這麼用,只要幫助裏有這個語法! 另外還有一些用邏輯或取餘操作符,這些符號,按照上面的使用方法會報錯的 比如我們在CMD裏輸入set /a var=1 & 1 "與運算",他並不會顯示爲1,而是報錯, 爲什麼?對於這樣的"邏輯或取餘操作符",我們需要把他們用雙引號引起來,也可以用轉義字符^,看例子 set /a var= 1 "&" 1 這樣結果就顯示出來了,其他邏輯或取餘操作符用法 set /a var= 1 "+" 1 異運算 set /a var= 1 "%" 1 取模運算 set /a var= 3 "<<" 2 左移位運算, 3的二進制爲11,左移 2位爲 1100,換成十進制就是12,自行驗證 set /a var= 4 ">>" 2右移位運算,4的二進制爲100,右移動2位爲1,結果爲1 龍捲風補充:凡是按位計算均需換算成二進制。 思考題:求2 的n次方 參考答案: @echo off set /p n=請輸入2的幾次方: set /a num=1^<^<n echo %num% pause 運行結果: 請輸入2的幾次方: 3 8 請按任意鍵繼續. . . 請輸入2的幾次方: 10 1024 請按任意鍵繼續. . . 請輸入2的幾次方: 15 32768 請按任意鍵繼續. . . 休息一下! ---------------------------- 史前超文明謎團 ---------------------------- 奧克洛(Oklo)是非洲加蓬共和國一個鈾礦的名字,法國有一些工廠使用從加蓬進口的鈾礦石。1972 6 月 7 日,法國科學家皮爾裏特在用質譜計分析天然丰度的六氟化鈾時,驚訝地發現,這批進口鈾礦石已被人利用過了。因爲這批鈾礦石的含鈾量相當低,鈾礦石的一般含鈾量爲 0.72%,而奧克洛鈾礦石的含鈾量卻不足0.3%,和我們現有的核反應堆的廢料幾乎相同。 這件事引起了法國原子能委員會的高度重視。爲此,許多科學家趕赴礦區進行考察研究。不久,奧克洛爆出了一條震驚世界的新聞:這裏有一個古老的核反應堆,而且核反應堆的構成非常合理。法國政府宣佈的這一發現,震驚了全世界。 這個核反應堆是由6個區域的大約500 噸鈾礦石組成,它的輸出功率很低,只有10到 100千瓦。據考證,該礦成礦年代大約在20 億年前,核反應堆在成礦後不久就開始運轉,運轉時間長達50萬年之久,核反應所產生的廢物,並沒有擴散,而是侷限在礦區周圍。面對這個保存完整、結構合理的核反應堆,科學家們膛目結舌。 -------------- 耐人尋味的疑問 -------------- 是誰在20 億年前留下了這個古老的核反應堆?是外星人的作品,還是前一代地球文明的遺蹟?20億年前的反應堆又怎麼來解釋呢?這個鈾礦到底是怎麼回事呢?有人認爲這是20億年前的天外來客的傑作。他們乘坐宇宙飛船來到地球上,選擇了奧克洛這個地方建造了原子反應堆,以原子裂變或聚變所釋放的能量爲能源動力,爲他們在地球上的活動提供能量。後來,他們離開了地球,返回了他們的“故里”,就在地球上留下了這座極古老而又神祕的原子反應堆。還有一種推斷認爲這是史前文明所留下的遺蹟。也就是說,20億年前,在今天我們叫做奧克洛的地方,可能存在着高度發達的文明,遠遠超過今天的人類文明。 ————選自《世界未解之謎》 三、用set命令進行字符串處理 1、字符串替換 好了,符號說到這,現在說%PATH:str1=str2% 上面語法的意思就是:將字符串變量%PATH%中的str1替換爲str2 這個是替換變量值的內容,看例子 @echo off set a= bbs. verybat. cn echo 替換前的值: "%a%" set var=%a: =% echo 替換後的值: "%var%" pause 運行顯示:(龍捲風添加) 替換前的值: " bbs. verybat. cn" 替換後的值: "bbs.verybat.cn" 對比一下,我們發現他把變量%a%的空格給替換掉了,從這個例子,我們就可以發現 %PATH:str1=str2%這個操作就是把變量%PATH%的裏的str1全部用str2 替換 比如我們把上面的例子改成這樣 @echo off set a=bbs.verybat.cn echo 替換前的值: "%a%" set var=%a:.=傷腦筋% echo 替換後的值: "%var%" pause 運行顯示: 替換前的值: "bbs.verybat.cn" 替換後的值: "bbs傷腦筋verybat傷腦筋cn" 解釋set var=%a:.=傷腦筋% set是命令 var是變量名 字a是要進行字符替換的變量的值,"."爲要替換的值, "傷腦筋"爲替換後的值! 執行後就會把變量%a%裏面的"."全部替換爲"傷腦筋" 這就是set的替換字符的很好的功能! 替換功能先講到這,下面將字符串截取功能 請注意:字符串的替換和截取功能在引用變量的地方均可以,並不一定必須要有set命令 例: @echo off set a=bbs.verybat.cn echo 替換前的值: "%a%" echo 替換後的值: "%a:.=傷腦筋%" pause 此例在echo語句中就替換了字符串,效果一樣。 2、字符串截取 ********************************************** 截取功能統一語法格式爲:%a:~[m[,n]]% ********************************************** 方括號表示可選,%爲變量標識符,a 爲變量名,不可少,冒號用於分隔變量名和說明部分,符號~可以簡單理解爲“偏移”即可,m爲偏移量(缺省爲0),n爲截取長度(缺省爲全部) %PATH:~10,5% 這個什麼意思,看例子: 截取功能例子1: @echo off set a=bbs.verybat.cn set var=%a:~1,2% echo %var% pause 執行後,我們會發現只顯示了"bs"兩個字母,我們的變量%a%的值不是爲bbs.verybat.cn嗎? 怎麼只顯示了第2個字母和第3個字母"bs",分析一結果我們就可以很容易看出 %PATH:~10,5%就是顯示變量PATH裏從 11位(偏移量 10)開始的 5 個字符! 分析set var=%a:~1,2% set是命令,var是變量值,a要進行字符操作的變量,"1"從變量"a"第幾位開始顯示,"2"表示顯示幾位。 合起來就是把變量a的值從第2位(偏移量1)開始,把 2個字符賦予給變量var 這樣應該明白了吧~ 其他兩種語法 %PATH:~-10% %PATH:~0,-2% 他們也是顯示指定變量指定幾位的值的意思 %PATH:~-10% 看例子 截取功能例子2: @echo off set a=bbs.verybat.cn set var=%a:~-3% echo %var% pause 運行結果:.cn 這個就是把變量a倒數 3位的值給變量VAR 當然我們也可以改成這樣 截取功能例子3: @echo off set a=bbs.verybat.cn set var=%a:~3% echo %var% pause 運行顯示:.verybat.cn 這個就是把變量a的從第 3 位開始後面全部的值給變量VAR %PATH:~0,-2% 例子 截取功能例子4: @echo off set a=bbs.verybat.cn set var=%a:~0,-3% echo %var% pause 執行後,我們發現顯示的是"bbs.verybat",少了".cn" 從結果分析,很容易分析出,這是把變量a的值從0位開始, 到倒數第三位之間的值全部賦予給var 如果改成這樣 截取功能例子5: @echo off set a=bbs.verybat.cn set var=%a:~2,-3% echo %var% pause 運行顯示:s.verybat 那麼他就是顯示從第3位(偏移量2)開始減去倒數三位字符的值,並賦予給變量var 講得好,例子就是說明問題,爲便於記憶,龍捲風小節如下: a=bbs.verybat.cn %a:~1,2% =“bs” 偏移量1,從第二位開始向右取2位 %a:~-3% =“.cn” 偏移量負3,即倒數 3位(也可理解爲留下右邊3位),右取全部 %a:~3% =“.verybat.cn” 偏移量3(也可理解爲去掉左邊3位),右取全部 %a:~0,-3% =“bbs.verybat” 偏移量0,右取長度至負3,即倒數3位 %a:~2,-3% =“s.verybat” 偏移量2,右取長度至負3,即倒數3位 ********************************************** 所以,截取功能統一語法格式爲:%a:~[m[,n]]% ********************************************** 方括號表示可選,%a%爲變量名,不可少,冒號用於分隔變量名和說明部分,符號~可以簡單理解爲“偏移”即可,m爲偏移量(缺省爲0),n爲截取長度(缺省爲全部) 上面所述用法其實相當於vbs函數mid、left、right %a:~0,n% 相當於函數left(a,n) 取左邊n位 %a:~-m% 相當於函數right(a,m) 取右邊m位 %a:~m,n% 相當於函數mid(a,m+1,n) 從m+1位開始取 n 位 %a:~m,-n% 相當於函數mid(a,m+1,len(a)-m-n),從m+1位開始,至倒數n+1位 %a:~m % 相當於函數mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),從m+1位開始取右邊全部。 思考題目:輸入任意字符串,求字符串的長度 參考答案: @echo off set /p str=請輸入任意長度的字符串: echo 你輸入了字符串:"%str%" call :stringlenth "%str%" num echo 字符串長度爲:%num% pause exit :StringLenth ::---------字符串長度計算子程序 ::---------參數%1爲字符串(如有空格,請用引號括起來) ::---------參數%2爲返回變量名稱,不能含空格或特殊字符 ::@echo off set theString=%~1 if not defined theString goto :eof set Return=0 :StringLenth_continue set /a Return+=1 set thestring=%thestring:~0,-1% if defined thestring goto StringLenth_continue if not "%2"=="" set %2=%Return% goto :eof 好了set的一些用法,就介紹到這了,希望對各位有所幫助,時間不早睡覺Zz.... by 傷腦筋 休息休息! 詩曰: 混沌未分天地亂,茫茫渺渺無人見。 自從盤古破鴻蒙,開闢從茲清濁辨。 覆載羣生仰至仁,發明萬物皆成善。 欲知造化會元功,須看西遊釋厄傳。 《西遊記》是我國著名神話小說,是中華五千年文化的見證之一。唐僧乃大唐高僧玄奘法師,往印度求取佛經,致使中華佛家文化大放異彩。 唐僧:代表古代修行人對佛法的堅定執着之心。雖然唐僧手無縛雞之力,但他不受金錢、美女、權利的誘惑,面對生死也不改變志向。這些都是古人所推崇的,所以唐僧是師父,其他人再有本事也只能當徒弟了。 悟空:“空”、“無”都是高層次的體現,故悟空本事最大。悟空的兵器爲“定海神針”,寓意佛家的“定”。 悟能:層次不高,缺點也多,但有點本事。因其缺點多,故又名“八戒”。 悟淨:層次不高,本事不大,僅僅有一個清淨之心,故名“悟淨”。但清淨心也很重要,所以有幾次悟空遇難時,乃悟淨所救。 第六章 if命令講解 最近發現有些朋友一老問 IF 命令的用法,IF 命令個人覺得很簡單,所以就一直沒把發放到新手教學貼裏說,現在我給補上一文,希望對各位"非常BAT 的"新手朋友們有所幫助. 現在開始: 在CMD使用IF /?打開IF的系統幫助(自己看我就不全部列出來了),我們會發現IF有 3 種基本的用法! 執行批處理程序中的條件處理。 IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command NOT 指定只有條件爲 false 的情況下, Windows XP 才 應該執行該命令。 ERRORLEVEL number 如果最後運行的程序返回一個等於或大於 指定數字的退出編碼,指定條件爲 true。 string1==string2 如果指定的文字字符串匹配,指定條件爲 true。 EXIST filename 如果指定的文件名存在,指定條件爲 true。 command 如果符合條件,指定要執行的命令。如果指定的 條件爲 FALSE,命令後可跟一個執行 ELSE 關鍵字後的命令的 ELSE 命令。 ELSE 子句必須在 IF 之後出現在同一行上。例如: IF EXIST filename ( del filename ) ELSE ( echo filename missing ) 第一種用法:IF [NOT] ERRORLEVEL number command 這個用法的基本做用是判斷上一條命令執行結果的代碼,以決定下一個步驟. 一般上一條命令的執行結果代碼只有兩結果,"成功"用 0 表示 "失敗"用 1表示. 舉個例子: @echo off net user IF %ERRORLEVEL% == 0 echo net user 執行成功了! pause 這是個簡單判斷上條命令是否執行成功. 細心的朋友可能會發現,這個用法和幫助裏的用法不太一樣,按照幫助裏的寫法"IF %ERRORLEVEL% == 0 echo net user 執行成功了! "這一句代碼應該寫成:IF ERRORLEVEL 0 echo net user 執行成功了! 那爲什麼我要寫成這樣呢?各位自己把代碼改掉執行後,就會發現錯誤了!用這種語法,不管你的上面的命令是否執行成功,他都會認爲命令成功了,不知道是BUG還是本人理解錯誤... 補充:這不是bug,而是 if errorlevel 語句的特點:當使用 if errorlevel 0 …… 的句式時,它的含義是:如果錯誤碼的值大於或等於0的時候,將執行某個操作;當使用 if %errorlevel%==0 …… 的句式時,它的含義是:如果錯誤碼的值等於 0 的時候,將執行某操作。因爲這兩種句式含義的差別,如果使用前一種句式的時候,錯誤碼語句的排列順序是從大到小排列 %ERRORLEVEL% 這是個系統變量,返回上條命令的執行結果代碼! "成功"用 0表示 "失敗"用 1表示. 當然還有其他參數,用的時候基本就這兩數字. 一般上一條命令的執行結果代碼只有兩結果,"成功"用 0 表示 "失敗"用 1表示 這只是一般的情況,實際上,errorlevel返回值可以在0~255之間,比如,xcopy默認的errorlevel值就有5個,分別表示5種執行狀態: 退出碼 說明 0 文件複製沒有錯誤。 1 if errorlevel 2 echo。 2 用戶按 CTRL+C 終止了 xcopy。 4 出現了初始化錯誤。沒有足夠的內存或磁盤空間,或命令行上輸入了無效的驅動器名稱或語法。 5 出現了磁盤寫入錯誤。 要判斷上面xcopy命令的 5種退出情況,應寫成: if errorlevel 5 echo出現了磁盤寫入錯誤 if errorlevel 4 echo出現了初始化錯誤 if errorlevel 2 echo用戶按 CTRL+C 終止了 xcopy if errorlevel 1 echo if errorlevel 2 echo if errorlevel 0 echo文件複製沒有錯誤。 才能正確執行。 補充完畢。 再舉幾個例子給新手理解 @echo off net usertest IF %ERRORLEVEL% == 1 echo net user 執行失敗了! pause 這個是判斷上一條命令是否執行失敗的 @echo off set /p var=隨便輸入個命令: %var% if %ERRORLEVEL% == 0 goto yes goto no :yes echo !var! 執行成功了 pause exit :no echo 基本上執行失敗了.. pause 這個是根據你輸入的命令,自動判斷是成功還是失敗了! 在來一個簡化版的 @echo off set /p var=隨便輸入個命令: %var% if %ERRORLEVEL% == 0 (echo %var%執行成功了) ELSE echo %var%執行失敗了! pause else後面寫上執行失敗後的操作! 當然我門還可以把if else這樣的語句分成幾行寫出來,使他看上去好看點... @echo off set /p var=隨便輸入個命令: %var% if %ERRORLEVEL% == 0 ( echo !var! 執行成功了 ) ELSE ( echo 基本上執行失敗了.. ) pause 這裏介紹的兩種簡寫對IF的三種語法都可以套用,不單單是在IF [NOT] ERRORLEVEL number command 這種法上才能用 第二種用法:IF [NOT] string1==string2 command 這個呢就是用來比較變量或者字符的值是不是相等的. 例子 @echo off set /p var=請輸入第一個比較字符: set /p var2=請輸入第二個比較字符: if %var% == %var2% (echo 我們相等) ELSE echo 我們不相等 pause 上面這個例子可以判斷你輸入的值是不是相等,但是你如果輸入相同的字符,但是如果其中一個後面打了一個空格, 這個例子還是會認爲相等,如何讓有空格的輸入不相等呢?我們在比較字符上加個雙引號就可以了. @echo off set /p var=請輸入第一個比較字符: set /p var2=請輸入第二個比較字符(多輸入個空格試試): if "%var%" == "%var2%" (echo 我們相等) ELSE echo 我們不相等 pause 第三種用法:IF [NOT] EXIST filename command 這個就是判斷某個文件或者文件夾是否存在的語法 例子 @echo off if exist "c:\test" (echo 存在文件) ELSE echo 不存在文件 pause 判斷的文件路徑加引號是爲了防止路徑有空格,如果路徑有空格加個雙引號就不會出現判斷出錯了! 這個語法沒什麼太多的用法,基本就這樣了,就不多介紹了. 另外我們看到每條IF用法後都有個[NOT]語句,這啥意思?其他加上他的話,就表示先判斷我們的條件不成立時, 沒加他默認是先判斷條件成立時,比如上面這個例子 @echo off if not exist "c:\test" (echo 存在文件) ELSE echo 不存在文件 pause 加個 NOT,執行後有什麼結果,如果你的 C 盤下根本就沒 c:\test,他還是會顯示"存在文件",這就表示了加了NOT會先判斷條件失敗!懂了吧,上面例子改成這樣就正確了! @echo off if not exist "c:\test" (echo 不存在文件) ELSE echo 存在文件 pause 第四種用法:IF增強的用法 IF [/I] string1 compare-op string2 command #參數/I表示不區分大小寫 IF CMDEXTVERSION number command IF DEFINED variable command #判斷變量是否存在,很有用 CMDEXTVERSION 條件的作用跟 ERRORLEVEL 的一樣,除了它 是在跟與命令擴展名有關聯的內部版本號比較。第一個版本 1。每次對命令擴展名有相當大的增強時,版本號會增加一個。 命令擴展名被停用時,CMDEXTVERSION 條件不是真的。 如果已定義環境變量,DEFINED 條件的作用跟 EXISTS 的一樣 IF DEFINED variable command IF NOT "variable"=="" command 上面兩條命令效果一樣。 用“set variable=”命令使變量variable變成未定義,即空值。 一句話,變量值爲空,則爲未定義;變量值不爲空,則爲已定義。 用語句IF DEFINED variable command判斷變量是否存在時,請注意variable爲不使用引導符號%的變量名,不能用寫爲%variable%,否則出錯。 例: if defined aa (echo 變量 aa存在) else (echo 變量aa不存在) 運行顯示:變量aa不存在 例: set aa=123 set aa= if defined aa (echo 變量 aa存在) else (echo 變量aa不存在) 運行顯示:變量aa不存在 例: @echo off if a == A (echo 我們相等) ELSE echo 我們不相等 pause 執行後會顯示:我們不相等 例: @echo off if /i a == A (echo 我們相等) ELSE echo 我們不相等 pause 加上/I不區分大小寫就相等了! 最後面還有一些用來判斷數字的符號 EQU - 等於 NEQ - 不等於 LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於 我就舉一個例子,大家都懂數學...不講多了 @echo off set /p var=請輸入一個數字: if %var% LEQ 4 (echo 我小於等於4) ELSE echo 我不小於等於4 pause BY 傷腦筋 ---------------------------- 難明其妙的水宮殿 ---------------------------- 土耳其首都伊斯坦布爾是座橫跨歐亞的歷史名城。來自歐亞非三大洲的各種文化在此交織碰撞,形成了各種文明奇蹟,也留下了許多難解的謎題。在伊斯坦布爾郊外的埃列巴坦有座被當地人視爲“惡魔之地”的宮殿,傳說殿中藏有惡魔。人們從空曠陰森的大殿外走過,往往能聽到裏面奇怪的嘩嘩水聲,格外玄祕恐怖,沒有人敢去探個究竟。直到 1920 年,一對情侶纔在好奇心的驅使下走進了大殿。他們剛剛踏入殿中,突然一聲巨響,地下頓時大水洶涌。兩人急忙轉身逃出,發現大水已經高出門檻但卻並不溢出。轉眼之間,水又立即退下,無影無蹤。兩人鼓足勇氣再次走進大殿,才發現這裏竟是一座華麗無比的古羅馬式廳堂,有高聳雪白的大理石柱、呼之欲出的美麗雕像、繁複優美的高雅壁畫。 聞訊而來的考古學家們對宮殿進行了全面的勘查,發現它大約建於公元4世紀左右,有可能是東羅馬帝國的君士坦丁大帝定都於此後的建築。殿中的大水漲落極有規律,一晝夜漲落6次,每次都有準確的時間。更奇怪的是宮殿大門之下發現的一堆碎石,它似乎是控制着水漲水落的閘門。碎石底下是一排空心圓柱,似乎是引水管道。這座奇怪的建築是幹什麼用的呢?有人說是羅馬人的蓄水池。那麼它爲什麼要建得如此華麗,而且能夠控制水位漲落呢?爲什麼大水高過門檻卻漫不出來呢?它的工作原理又是什麼? ————選自《世界未解之謎》 第七章 DOS 編程高級技巧 本章節乃龍捲風根據自己平時學用批處理的經驗而總結的,不斷補充中……。 一、交互界面設計 沒啥說的,看看高手設計的菜單界面吧: @echo off cls title 終極多功能修復 :menu cls color 0A echo. echo ============================== echo 請選擇要進行的操作,然後按回車 echo ============================== echo. echo 1.網絡修復及上網相關設置,修復IE,自定義屏蔽網站 echo. echo 2.病毒專殺工具,端口關閉工具,關閉自動播放 echo. echo 3.清除所有多餘的自啓動項目,修復系統錯誤 echo. echo 4.清理系統垃圾,提高啓動速度 echo. echo Q.退出 echo. echo. :cho set choice= set /p choice= 請選擇: IF NOT "%choice%"=="" SET choice=%choice:~0,1% if /i "%choice%"=="1" goto ip if /i "%choice%"=="2" goto setsave if /i "%choice%"=="3" goto kaiji if /i "%choice%"=="4" goto clean if /i "%choice%"=="Q" goto endd echo 選擇無效,請重新輸入 echo. goto cho 只要學完本教程前面的章節,上面的程序應該能看懂了。 二、if…else…條件語句 前面已經談到,DOS條件語句主要有以下形式 IF [NOT] ERRORLEVEL number command IF [NOT] string1==string2 command IF [NOT] EXIST filename command 增強用法:IF [/I] string1 compare-op string2 command 增強用法中加上/I就不區分大小寫了! 增強用法中還有一些用來判斷數字的符號: EQU - 等於 NEQ - 不等於 LSS - 小於 LEQ - 小於或等於 GTR - 大於 GEQ - 大於或等於 上面的command命令都可以用小括號來使用多條命令的組合,包括else子句,組合命令中可以嵌套使用條件或循環命令。 例如: IF EXIST filename ( del filename ) ELSE ( echo filename missing ) 也可寫成: if exist filename (del filename) else (echo filename missing) 但這種寫法不適合命令太多或嵌套命令的使用。 ---------------------------- 水晶人頭之謎 ---------------------------- 你可曾見到這樣一顆水晶雕成的人頭?它和真人頭骨同等大小,用一整塊水晶雕琢而成,牙齒十分整齊地排列在牙牀上,鼻骨由 3 顆水晶石拼接起來,兩隻眼睛各爲一塊圓形水晶。人頭的底部還藏着棱鏡。它的模樣估計是一個女人的頭顱。整個水晶頭骨上沒有任何人工打磨的痕跡,看上去精美絕倫、熠熠生輝,即使用現代科技雕琢它也會十分耗時費工,可科學家卻推斷它早在 3600 年前就已誕生,你相信有這樣的事情嗎? 這顆水晶頭骨發現於中美洲的洪都拉斯,難道是印第安人的祖先製作出來的嗎?可20 世紀的印第安人還在美洲的叢林裏過着衣不蔽體、食不果腹的原始生活,誰能相信他們的祖先早在幾千年前就擁有了如此高超的雕刻技藝呢?我們知道,水晶的硬度非常之高,用一般的器具是很難對其加工的,那麼古人是用什麼工具雕刻它的呢?而且要找到這麼大的水晶實在是不容易的事情啊。他們又如何能憑藉原始的手工工具把它雕刻得如此成功?現在研究者還一致認爲,當時的加工者並不瞭解水晶晶體的結構,他們也不具備現代的光學和人體骨骼構造的知識,在這樣一種模糊的認識上能雕刻出這樣的傑作,實在讓人稱奇!在古代瑪雅的傳說裏,這顆水晶人頭具有某種神奇的力量,他們通過它與神靈相通。 ————選自《世界未解之謎》 三、循環語句 1、指定次數循環 FOR /L %variable IN (start,step,end) DO command [command-parameters] 組合命令: FOR /L %variable IN (start,step,end) DO ( Command1 Command2 …… ) 2、對某集合執行循環語句。 FOR %%variable IN (set) DO command [command-parameters] %%variable 指定一個單一字母可替換的參數。 (set) 指定一個或一組文件。可以使用通配符。 command 對每個文件執行的命令,可用小括號使用多條命令組合。 FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 檢查以 [drive:]path 爲根的目錄樹,指向每個目錄中的 FOR 語句。如果在 /R 後沒有指定目錄,則使用當前 目錄。如果集僅爲一個單點(.)字符,則枚舉該目錄樹。 同前面一樣,command可以用括號來組合: FOR /R [[drive:]path] %variable IN (set) DO ( Command1 Command2 …… commandn ) 3、條件循環 上面的循環結構是用for命令來實現的,for命令循環有一個缺點,就是整個循環被當作一條命令語句,涉及到變量延遲的問題。 利用goto語句和條件判斷,dos可以實現條件循環,很簡單啦,看例子: 例: @echo off set var=0 rem ************循環開始了 :continue set /a var+=1 echo%var%次循環 if %var% lss 100 goto continue rem ************循環結束了 echo 循環執行完畢 pause 例: @echo off set var=100 rem ************循環開始了 :continue echo%var%次循環 set /a var-=1 if %var% gtr 0 goto continue rem ************循環結束了 echo 循環執行完畢 pause 四、子程序 在批處理程序中可以調用外部可運行程序,比如 exe 程序,也可調用其他批處理程序,這些也可以看作子程序,但是不夠方便,如果被調用的程序很多,就顯得不夠簡明瞭,很繁瑣。 windowsXP 中,批處理可以調用本程序中的一個程序段,相當於子程序,這些子程序一般放在主程序後面。 子程序調用格式: CALL :label arguments 子程序語法: :label command1 command2 ...... commandn goto :eof 在子程序段中,參數%0指標籤:label 子過程一般放在最後,並且注意在主程序最後要加上exit或跳轉語句,避免錯誤的進入子過程。 子程序和主程序中的變量都是全局變量,其作用範圍都是整個批處理程序。 傳至子程序的參數在 call 語句中指定,在子程序中用%1、%2%9 的形式調用,而子程序返回主程序的數據只需在調用結束後直接引用就可以了,當然也可以指定返回變量,請看下面的例子。 子程序例1: @echo off call :sub return 你好 echo 子程序返回值:%return% pause :sub set %1=%2 goto :eof 運行結果:你好 子程序例2:設計一個求多個整數相加的子程序 @echo off set sum=0 call :sub sum 10 20 35 echo 數據求和結果:%sum% pause :sub rem 參數 1爲返回變量名稱 set /a %1=%1+%2 shift /2 if not "%2"=="" goto sub goto :eof 運行結果:65 win98系統中,不支持上面這種標號調用,須將子程序單獨保存爲一個批處理程序,然後調用。 ---------------------------- 進化論的空白之謎 ---------------------------- 古猿:生活於1400萬~800 萬年前 南猿:生活於400萬~190萬年前 猿人:生活於170萬~20萬年前 在這三個階段的兩大銜接處,有幾百萬年的空白,科學家迄今沒有發現此間的任何生物化石。 ————選自《世界未解之謎》 五、用ftp命令實現自動下載 ftp是常用的下載工具,ftp界面中有40多個常用命令,自己學習了,不介紹了。這裏介紹如何用dos命令行調用ftp命令,實現ftp自動登錄,並上傳下載,並自動退出ftp程序。 其實可以將ftp 命令組合保存爲一個文本文件,然後用以下命令調用即可。 ftp -n -s:[[drive:]path]filename 上面的filename爲ftp命令文件,包括登錄IP地址,用戶名、密碼、操作命令等 例: open 90.52.8.3 #打開ip user iware #用戶爲iware password8848 #密碼 bin #二進制傳輸模式 prompt cd tmp1 #切換至iware用戶下的tmp1目錄 pwd lcd d:\download #本地目錄 mget * #下載tmp1目錄下的所有文件 bye #退出ftp 六、用7-ZIP 實現命令行壓縮和解壓功能 語法格式:(詳細情況見7-zip幫助文件,看得頭暈可以跳過,用到再學) 7z <command> [<switch>...] <base_archive_name> [<arguments>...] 7z.exe的每個命令都有不同的參數<switch>,請看幫助文件 <base_archive_name>爲壓縮包名稱 <arguments>爲文件名稱,支持通配符或文件列表 其中,7z是至命令行壓縮解壓程序7z.exe,<command>是7z.exe包含的命令,列舉如下: a: Adds files to archive. 添加至壓縮包 a命令可用參數: -i (Include) -m (Method) -p (Set Password) -r (Recurse) -sfx (create SFX) -si (use StdIn) -so (use StdOut) -ssw (Compress shared files) -t (Type of archive) -u (Update) -v (Volumes) -w (Working Dir) -x (Exclude) b: Benchmark d: Deletes files from archive. 從壓縮包中刪除文件 d命令可用參數: -i (Include) -m (Method) -p (Set Password) -r (Recurse) -u (Update) -w (Working Dir) -x (Exclude) e: Extract 解壓文件至當前目錄或指定目錄 e命令可用參數: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries) l: Lists contents of archive. t: Test u: Update x: eXtract with full paths用文件的完整路徑解壓至當前目錄或指定目錄 x命令可用參數: -ai (Include archives) -an (Disable parsing of archive_name) -ao (Overwrite mode) -ax (Exclude archives) -i (Include) -o (Set Output Directory) -p (Set Password) -r (Recurse) -so (use StdOut) -x (Exclude) -y (Assume Yes on all queries) 七、調用VBScript程序 使用 Windows 腳本宿主,可以在命令提示符下運行腳本。CScript.exe 提供了用於設置腳本屬性的命令行開關。 用法:CScript 腳本名稱 [腳本選項...] [腳本參數...] 選項: //B 批模式:不顯示腳本錯誤及提示信息 //D 啓用 Active Debugging //E:engine 使用執行腳本的引擎 //H:CScript 將默認的腳本宿主改爲 CScript.exe //H:WScript 將默認的腳本宿主改爲 WScript.exe (默認) //I 交互模式(默認,與 //B 相對) //Job:xxxx 執行一個 WSF 工作 //Logo 顯示徽標(默認) //Nologo 不顯示徽標:執行時不顯示標誌 //S 爲該用戶保存當前命令行選項 //T:nn 超時設定秒:允許腳本運行的最長時間 //X 在調試器中執行腳本 //U 用 Unicode 表示來自控制檯的重定向 I/O “腳本名稱”是帶有擴展名和必需的路徑信息的腳本文件名稱,如d:\admin\vbscripts\chart.vbs。 “腳本選項和參數”將傳遞給腳本。腳本參數前面有一個斜槓 (/)。每個參數都是可選的;但不能在未指定腳本名稱的情況下指定腳本選項。如果未指定參數,則 CScript 將顯示 CScript 語法和有效的宿主參數。 八、將批處理轉化爲可執行文件: 由於批處理文件是一種文本文件,任何人都可以對其進行隨便編輯,不小心就會把裏面的命令破壞掉,所以如果將其轉換成.com格式的可執行文件,不僅執行效率會大大提高,而且不會破壞原來的功能,更能將優先級提到最高。Bat2Com 就可以完成這個轉換工作。 小知識:在DOS環境下,可執行文件的優先級由高到低依次爲.com>.exe>.bat>.cmd,即如果在同一目錄下存在文件名相同的這四類文件,當只鍵入文件名時,DOS執行的是name.com,如果需要執行其他三個文件,則必須指定文件的全名,如name.bat。 這是一個只有5.43K大小的免費綠色工具,可以運行在純DOS或DOS 窗口的命令行中,用法:Bat2Com FileName,這樣就會在同一目錄下生成一個名爲 FileNme.com 的可執行文件,執行的效果和原來的.bat文件一樣。 ---------------------------- 人體輝光之謎 ---------------------------- 現代科技發現了很多讓人吃驚的現象,它能使人們相信很多在傳說或者夢境裏纔有的事情。宗教油畫上的小天使總是頭頂光圈飛來飛去。可你相信嗎?在我們每個人的身體表面其實都有一層肉眼所見不到的彩色光!天使擁有的還只是頭頂的光圈,可我們擁有的是全身的輝光,這多神奇。只要通過特殊的手段,譬如憑藉某種塗了特殊顏料的玻璃,我們就能親眼見到自己身體周圍的輝光。而科學家發明了一種特殊的高頻電場照相技術,能把人體輝光的狀況顯示在彩色照片上,不僅能讓我們一睹爲快,還能永久收藏。這實在是一件有意思的事情。科學家的實驗還發現人體輝光是處於變動之中的,人體不同部位輝光的顏色不一樣,而且在人體的精神和身體狀況有變動時,輝光的明暗、強弱和大小都會隨之發生變化。 ————選自《世界未解之謎》 九、時間延遲 本條參考引用[英雄]教程 什麼是時間延遲?顧名思義,就是執行一條命令後延遲一段時間再進行下一條命令。 延遲的應用見下節:“模擬進度條”。 1、利用ping 命令延時 例: @echo off echo 延時前:%time% ping /n 3 127.0.0.1 >nul echo 延時後:%time% pause 解說:用到了 ping 命令的“/n”參數,表示要發送多少次請求到指定的 ip。本例中要發送 3 次請求到本機的ip(127.0.0.1)。127.0.0.1 可簡寫爲127.1。“>nul”就是屏蔽掉ping命令所顯示的內容。 2、利用for命令延時 例: @echo off echo 延時前:%time% for /l %%i in (1,1,5000) do echo %%i>nul echo 延時後:%time% pause 解說:原理很簡單,就是利用一個計次循環並屏蔽它所顯示的內容來達到延時的目的。 3、利用vbs延遲函數,精確度毫秒,誤差1000毫秒內 例: @echo off echo %time% call :delay 5000 echo %time% pause exit :delay echo WScript.Sleep %1>delay.vbs CScript //B delay.vbs del delay.vbs goto :eof 運行顯示: 10:44:06.45 10:44:11.95 請按任意鍵繼續. . . 上面的運行結果顯示實際延時了 5500 毫秒,多出來的 500 毫秒時建立和刪除臨時文件所耗費的時間。誤差在一秒之內。 4、僅用批處理命令實現任意時間延遲,精確度10毫秒,誤差50毫秒內 僅用批處理命令就可以實現延遲操作。 例: @echo off set /p delay=請輸入需延遲的毫秒數: set TotalTime=0 set NowTime=%time% ::讀取起始時間,時間格式爲:13:01:05.95 echo 程序開始時間:%NowTime% :delay_continue set /a minute1=1%NowTime:~3,2%-100 ::讀取起始時間的分鐘數 set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000 ::將起始時間的秒數轉爲毫秒 set NowTime=%time% set /a minute2=1%NowTime:~3,2%-100 :: 讀取現在時間的分鐘數 set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000 ::將現在時間的秒數轉爲毫秒 set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1% if %TotalTime% lss %delay% goto delay_continue echo 程序結束時間:%time% echo 設定延遲時間:%delay%毫秒 echo 實際延遲時間:%TotalTime%毫秒 pause 運行顯示: 請輸入需延遲的毫秒數:6000 程序開始時間:15:32:16.37 程序結束時間:15:32:22.37 設定延遲時間:6000毫秒 實際延遲時間:6000毫秒 請按任意鍵繼續. . . 實現原理:首先設定要延遲的毫秒數,然後用循環累加時間,直到累加時間大於等於延遲時間。 誤差:windows系統時間只能精確到10毫秒,所以理論上有可能存在10 毫秒誤差。 經測試,當延遲時間大於500毫秒時,上面的延遲程序一般不存在誤差。當延遲時間小於500毫秒時,可能有幾十毫秒誤差,爲什麼?因爲延遲程序本身也是有運行時間的,同時系統時間只能精確到 10 毫秒。 爲了方便引用,可將上面的例子改爲子程序調用形式: @echo off echo 程序開始時間:%Time% call :delay 10 echo 實際延遲時間:%totaltime%毫秒 echo 程序結束時間:%time% pause exit ::-----------以下爲延時子程序-------------------- :delay @echo off if "%1"=="" goto :eof set DelayTime=%1 set TotalTime=0 set NowTime=%time% ::讀取起始時間,時間格式爲:13:01:05.95 :delay_continue set /a minute1=1%NowTime:~3,2%-100 set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000 set NowTime=%time% set /a minute2=1%NowTime:~3,2%-100 set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000 set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1% if %TotalTime% lss %DelayTime% goto delay_continue goto :eof 十、模擬進度條 下面給出一個模擬進度條的程序。如果將它運用在你自己的程序中,可以使你的程序更漂亮。 @echo off mode con cols=113 lines=15 &color 9f cls echo. echo 程序正在初始化. . . echo. echo ┌──────────────────────────────────────┐ set/p=<nul for /L %%i in (1 1 38) do set /p a=<nul&ping /n 1 127.0.0.1>nul echo 100%% echo └──────────────────────────────────────┘ pause 解說:“set /p a=<nul”的意思是:只顯示提示信息“■”且不換行,也不需手工輸入任何信息,這樣可以使每個“■”在同一行逐個輸出。“ping /n 0 127.1>nul”是輸出每個“■”的時間間隔,即每隔多少時間輸出一個“■”。 十一、特殊字符的輸入及應用 開始 -> 運行 -> 輸入cmd -> edit -> ctrl+p(意思是允許輸入特殊字符)-> 按ctrl+a將會顯示笑臉圖案。 (如果要繼續輸入特殊字符請再次按ctrl+p,然後ctrl+某個字母) 以上是特殊字符的輸入方法,選自[英雄]教程,很管用的。也就是用編輯程序 edit 輸入特殊字符,然後保存爲一文本文件,再在 windows下打開此文件,複製其中的特殊符號即可。 一些簡單的特殊符號可以在dos命令窗口直接輸入,並用重定向保存爲文本文件。 例: C:>ECHO ^G>temp.txt “^G”是用 Ctrl+G或Alt+007 輸入,輸入多個^G可以產生多聲鳴響。 特殊字符的應用也很有意思,這裏僅舉一例:退格鍵 退格鍵表示刪除左邊的字符,此鍵不能在文檔中正常輸入,但可以通過 edit 編輯程序錄入並複製出來。即 “”。 利用退格鍵,可以設計閃爍文字效果 例:文字閃爍 @echo off :start set/p=牀前明月光<nul ::顯示文字,光標停於行尾 ping -n 0 127.0.0.1>nul ::設置延遲時間 set /p a= <nul :: 輸出一些退格符將光標置於該行的最左端(退格符的數量可以自己調整)。 set /p a= <nul ::輸出空格將之前輸出的文字覆蓋掉。 set /p a= <nul ::再次輸出退格符將光標置於該行的最左端,這裏的退格符數量一定不能比前面的空格數少。 ::否則光標不能退到最左端。 goto start 例:輸出唐詩一首,每行閃動多次 @echo off setlocal enabledelayedexpansion set str=牀前明月光 疑是地上霜 舉頭望明月 低頭思故鄉 ::定義字符串str for %%i in (%str%) do ( rem 由於str 中含有空格,則以空格爲分隔符將str中的每一個部分依次賦給變量%%i。 set char=%%i echo. echo. for /l %%j in (0,1,5) do ( set/p=!char:~%%j,1!<nul rem 依次取出變量char中的每一個字符,並顯示。 ping -n 0 127.0.0.1>nul rem 設置輸出每個字符的時間延遲。 ) call :hero %%i ) pause>nul exit :hero for /l %%k in (1,1,10) do ( ping /n 0 127.0.0.1>nul set /p a= <nul set /p a= <nul set /p a= <nul ping /n 0 127.0.0.1>nul set /p a=%1<nul ) ::文字閃動 goto :eof ---------------------------- 神祕的瑜伽 ---------------------------- 印度的瑜伽術充滿了神奇,很多人曾親眼見識過瑜伽師的奇特本領。他們能夠表演“千里問診”、“外氣治病”、“靜會騰身”、“思維傳遞”等令人拍案稱奇的功夫;更玄的是,有的瑜伽師還能控制自己心臟的跳動,這不能不令觀者瞠目結舌。一位叫馬哈里的瑜伽師就當衆做過這種表演。在他運氣靜坐的時候,沒有脈搏和心音。醫生的心電圖顯示爲一條直線!這真是讓人難以相信。而另一位叫薩蒂雅魯爾蒂的瑜伽師更是在衆目睽睽之下被活埋了8晝夜。他在這期間沒有進食,沒有脈搏,沒有呼吸,心電圖也出現了直線,直到最後一天心電圖才恢復成曲線。他出土的時候,全身僵硬,反應麻木,過了一段時間後才漸漸恢復正常。 科學家力圖用科學知識對此做出合理解釋。他們發現在瑜伽師靜坐練功的時候,其人體代謝會降低,耗氧量會減少,肌體也能得到充分休息。而在表演心臟停止時,他們或者急劇提高腹壓,減少心臟供血,而使其體積變小、活動減弱;或者是通過猛烈收縮胃部,使相應神經急劇緊張,而大大降低心臟活動。可這些都只能使瑜伽師能在一定程度上控制心臟活動,而他們居然能使心臟完全停止跳動,這是現代科學所無法解答的。 ————選自《世界未解之謎》 十二、隨機數(%random%)的應用技巧 %RANDOM% 系統變量 返回 0 到 32767 之間的任意十進制數字。由 Cmd.exe 生成。 2的 15次方等於32768,上面的0~32767實際就是 15 位二進制數的範圍。 那麼,如何獲取100以內的隨機數呢?很簡單,將%RANDOM% 100進行求餘運算即可,見例子。 例:生成5 個 100以內的隨機數 @echo off setlocal enabledelayedexpansion for /L %%i in (1 1 5) do ( set /a randomNum=!random!%%100 echo 隨機數:!randomNum! ) pause 運行結果:(每次運行不一樣) 隨機數:91 隨機數:67 隨機數:58 隨機數:26 隨機數:20 請按任意鍵繼續. . . 求餘數運算set /a randomNum=!random!%%100中的100可以是 1~32768之間的任意整數。 總結:利用系統變量%random%,求餘數運算%%���字符串處理等,可以實現很多隨機處理。 思考題目:生成給定位數的隨機密碼 解答思路:將26個英文字母或10數字以及其它特殊字符組成一個字符串,隨機抽取其中的若干字符。 參考答案1:(簡單) @echo off call :randomPassword 5 pass1 pass2 echo %pass1% %pass2% pause exit :randomPassword ::---------生成隨機密碼 ::---------%1爲密碼長度,%2 及以後爲返回變量名稱 ::---------for命令最多隻能區分31個字段 @echo off set password_len=%1 if not defined password_len goto :eof if %password_len% lss 1 goto :eof set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z set return= set num=0 :randomPassword1 set /a num+=1 set /a numof=%random%%%26+1 for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i if %num% lss %password_len% goto randomPassword1 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof 參考答案2:(最優) @echo off call :randomPassword 6 pass1 pass2 pass3 echo %pass1% %pass2% %pass3% pause exit :randomPassword ::---------生成隨機密碼 ::---------%1爲密碼長度,%2 及以後爲返回變量名稱 ::---------goto循環、變量嵌套、命令嵌套 @echo off if "%1"=="" goto :eof if %1 lss 1 goto :eof set password_len=%1 set return= set wordset=abcdefghijklmnopqrstuvwxyz023456789_ ::---------------------------循環 :randomPassword1 set /a numof=%random%%%36 call set return=%return%%%wordset:~%numof%,1%% set /a password_len-=1 if %password_len% gtr 0 goto randomPassword1 ::---------------------------循環 if not "%2"=="" set %2=%return% shift /2 if not "%2"=="" goto randomPassword goto :eof 說明:本例涉及到變量嵌套和命令嵌套的應用,見後。 十三、變量嵌套 與 命令嵌套 和其它編程語言相比,dos功能顯得相對簡單,要實現比較複雜的功能,需要充分運用各種技巧,變量嵌套與命令嵌套就是此類技巧之一。 先複習一下前面的“字符串截取”的關鍵內容: ********************************************** 截取功能統一語法格式爲:%a:~[m[,n]]% ********************************************** 方括號表示可選,%爲變量標識符,a 爲變量名,不可少,冒號用於分隔變量名和說明部分,符號~可以簡單理解爲“偏移”即可,m爲偏移量(缺省爲0),n爲截取長度(缺省爲全部)。 百分號如果需要當成單一字符,必須寫成%% 以上是dos變量處理的通用格式,如果其中的m、n爲變量,那麼這種情況就是變量嵌套了。 比如設變量 word爲“abcdefghij”,變量num 爲“123456789” %word:~4,1%爲e,其中 4 可以從變量num中取值,即%num:~3,1%,寫成組合形式如下: %word:~%num:~3,1%,1% 經測試這種寫法不能正確執行,寫成%word:~(%num:~3,1%),1%同樣不行,那麼,怎麼實現這種變量嵌套呢?這就必須結合命令嵌套。 什麼是命令嵌套呢?簡單的說,首先用一條dos命令生成一個字符串,而這個字符串是另一條dos命令,用call語句調用字符串將其執行,從而得到最終結果。 例:用call語句實現命令嵌套 @echo off set str1=aaa echo ok bbb echo 初始字符串:%str1% echo 生成命令字符串如下: echo %str1:~4,7% echo 運行命令字符串生成最終結果爲: call %str1:~4,7% pause 運行顯示: 初始字符串:aaa echo ok bbb 生成命令字符串如下: echo ok 運行命令字符串生成最終結果爲: ok 請按任意鍵繼續. . . 變量嵌套與命令嵌套結合運用,見下例。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章