第一節 常用批處理內部命令簡介
批處理定義:顧名思義,批處理文件是將一系列命令按一定的順序集合為一個可執行的文本文件,其擴展名為BAT或者CMD。這些命令統稱批處理命令。
小知識:可以在鍵盤上按下Ctrl+C組合鍵來強行終止一個批處理的執行過程。
了解了大概意思后,我們正式開始學習.先看一個簡單的例子!
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT echo "歡迎來到非常BAT!" pause
從上面這個簡單的批處理中,我們可以發現其實批處理就是運用一些含有特殊意義的符號和一些完成指定功能的命令組合而成,那么在批處理中有多少這樣的特殊符號和功能命令呢?我們現在就來仔細了解一下一些最常用的!
批處理的常見命令(未列舉的命令還比較多,請查閱幫助信息)
1、REM 和 ::
注釋語句在程序代碼當中,充當提示作用,方便代碼功能的閱讀。但是,注釋語句是不會隨着功能代碼運行的,也就是說,注釋語句沒有任何功能。
REM為注釋命令,一般用來給程序加上注解,該命令后的內容不被執行,但能回顯(可以被@echo off關閉)。
:: 也可以起到rem 的注釋作用, 而且更簡潔有效; 但有兩點需要注意:
(1)、任何以冒號:開頭的字符行, 在批處理中都被視作標號, 而直接忽略其后的所有內容。
有效標號:冒號后緊跟一個以字母數字開頭的字符串,goto語句可以識別。
無效標號:冒號后緊跟一個非字母數字的一個特殊符號,goto無法識別的標號,可以起到注釋作用,所以:: 常被用作注釋符號,其實 :+ 也可起注釋作用。
(2)、與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(換行)
3、PAUSE
PAUSE,玩游戲的人都知道,暫停的意思,在這里就是停止系統命令的執行並顯示下面的內容
例:
PAUSE
運行顯示:
請按任意鍵繼續. . .
要顯示其他提示語,可以這樣用:echo 其他提示語 & pause > nul
4、Set
語法形式:
SET [variable=[string]]
SET /P variable=[promptString]
SET /A expression
(1)定義變量
set var=10 ::=號兩邊不能有空格
set var= ::給變量賦值是定義變量,不給變量賦值類似於注銷變量
(2)SET /A expression
/A 讓SET可以支持數學符號進行加減等一些數學運算,該表達式解析很簡單並以遞減的優先順序支持下列操作:
() - 分組
! ~ - - 一元運算符
* / % - 算數運算符
+ - - 算數運算符
<< >> - 邏輯移位
& - 按位“與”
^ - 按位“異”
| - 按位“或”
= *= /= %= += -= &= ^= |= <<= >>= - 賦值
, - 表達式分隔符
@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT
set a=100
set b=1000
set /a c=a+b
echo the result is :%c%
set /a a=1+1,b=2+1,c=3+1
echo %a% %b% %c%
set /a var= 1 "&" 1 ::邏輯或區域操作等運算符,需要用雙引號引起來
set /a var= 1 "%" 1
set /a var= 2 "<<" 2
set /a var= 4 ">>" 2
pause
(3)SET /P variable=[promptString]
功能等待用戶輸入
windows 2000 和windows 是沒有choice這個命令,choice的等待用戶輸入功能就要通過set /p來實現
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT set /p str=請輸入你想輸入的字符: echo 你輸入的字符串為:%str% pause
(4)結合字符串操作,對變量的內容進行剪切、替換等操作
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT set str=welcome come to bat set var=%str:~3,4% echo %var% pause
(5)顯示環境變量
如:
set 會顯示當前所有的系統環境變量
set c 會顯示當前所有的以c開頭或C開頭的變量(不區分大小寫)
5、ERRORLEVEL
程序返回碼
echo %errorlevel%
每個命令運行結束,可以用這個命令行格式查看返回碼,用於判斷剛才的命令是否執行成功.
默認值為0,命令執行成功則返回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 = 亮白色
例如:COLOR FC
如果沒有給定任何參數,該命令會將顏色還原到 CMD.EXE 啟動時的顏色。這個值來自當前控制台窗口、/T 開關或DefaultColor 注冊表值。如果用相同的前景和背景顏色來執行 COLOR 命令,COLOR 命令會將 ERRORLEVEL 設置為 1。
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和 :
在批處理中允許以“:XXX”來構建一個標號,然后用goto XXX跳轉到標號:XXX處,然后執行標號后的命令。
例:
if {%1}=={} goto noparms
if "%2"=="" goto noparms
標簽的名字可以隨便起,但是最好是有意義的字符串啦,前加個冒號用來表示這個字符串是標簽,goto命令就是根據這個冒號(:)來尋找下一步跳到到那里。最好有一些說明這樣你別人看起來才會理解你的意圖啊。
例:
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT :start set /p var=請輸入一個大於3的數字 echo %var% if %var% leq 3 goto start pause
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 Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT echo 111 >test.txt echo 222 >>test.txt type test.txt|find "111" del test.txt pause
10、start 命令
Start會開啟新窗口來運行程序,如果新窗口不正常退出,你的批處理就不能正常執行下去
語法:start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
"title" 指定在“命令提示符”窗口標題欄中顯示的標題。
/dpatch 指定啟動目錄。
/i 將 Cmd.exe 啟動環境傳送到新的“命令提示符”窗口。
/min 啟動新的最小化窗口。
/max 啟動新的最大化窗口。
/separate 在單獨的內存空間啟動 16 位程序。
/shared 在共享的內存空間啟動 16 位程序。
/low 以空閑優先級啟動應用程序。
/normal 以一般優先級啟動應用程序。
/high 以高優先級啟動應用程序。
/realtime 以實時優先級啟動應用程序。
/abovenormal 以超出常規優先級的方式啟動應用程序。
/belownormal 以低出常規優先級的方式啟動應用程序。
/wait 啟動應用程序,並等待其結束。
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT start /w /max "" "D:\Program Files\KuGou2012\KuGou.exe" echo start come from bat pause
13、CALL
CALL命令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完后,再繼續執行原來的批處理
調用一條批處理命令,和直接執行命令效果一樣,特殊情況下很有用,比如變量的多級嵌套,見教程后面。在批處理編程中,可以根據一定條件生成命令字符串,用call可以執行該字符串,見例子。
(1)調用的其它批處理程序。filename 參數必須具有 .bat 或 .cmd 擴展名,也可執行其它格式的可執行文件
語法:CALL [drive:][path]filename [batch-parameters]
(2)call具有goto的功能,在程序中實現靈活跳轉,被調用的命令段以標簽:label開頭以命令goto :eof結尾
語法:CALL :label arguments
另外,批腳本文本參數參照(%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 Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT 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 Goto :eof
程序1:father.bat
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT set a=1 pause echo call child.bat call child.bat echo end call pause echo %b% pause
程序2:child.bat
@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT
echo %a%
set b=20
echo b=%b%
pause
輸出:
請按任意鍵繼續. . .
call xe.bat
1
b=20
請按任意鍵繼續. . .
end call
注意,這個實驗中,main.bat定義了變量a為1,在child.bat中定義了變量b為1
main.bat首先將call child.bat,然后child.bat將echo %a%,現在能正常顯示1。call完之后,main.bat將echo %b%,也能正常顯示20
如果將call改為start,待child.bat執行完再關閉之后,main.bat繼續echo %b%,將無法顯示變量b的值
call的時候,他們擁有同一個殼cmd.exe,在同一個進程當中,所以他們的變量是互通的
Call和Start的區別
1、call用來調用執行另一個bat或者cmd文件(當然也可執行其它格式的可執行文件),start用來調用執行其他格式的可執行文件(exe,com,vbs...)。
2、call具有goto的功能,在程序中實現靈活跳轉,而start則不具有這種功能
對於start,概況二句話:“不同進程不能傳值”,“相同進程單向傳值,老子傳兒子,非兒子傳老子“
對於call,“同一進程,變量互通”
start的時候,他們擁有兩個殼cmd.exe,但在不同的進程當中,而由於這是他們的殼都是cmd.exe,所以child.bat可以看成是main.bat的子進程,子進程可以讀取父進程中的變量,但不能賦予父進程變量的值。而當start的程序不同的殼的時候,他們就不是父子進程關系。
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 先保存當前目錄,在將指定目錄設置為當前目錄
popd 將上次調用pushd時的目錄作為當前目錄
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT 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 Goto :eof
14、shift
更改批處理文件中可替換參數的位置。
SHIFT [/n]
如果命令擴展名被啟用,SHIFT 命令支持/n 命令行開關;該命令行開關告訴
命令從第 n 個參數開始移位;n 介於零和八之間。
例如:
SHIFT /2
會將 %3 移位到 %2,將 %4 移位到 %3,等等;並且不影響 %0 和 %1。
15、ATTRIB 顯示或更改文件屬性
ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]
+ 設置屬性。
- 清除屬性。
R 只讀文件屬性。
A 存檔文件屬性。
S 系統文件屬性。
H 隱藏文件屬性。
[drive:][path][filename]
指定要處理的文件屬性。
/S 處理當前文件夾及其子文件夾中的匹配文件。
/D 也處理文件夾。
例:
attrib C:\dsw.bat +R +S
上面的命令將把dsw.bat設置為只讀、系統屬性
16、多選擇功能
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT echo. echo. :cho set /p choice=請選擇: 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
17、tskill
tskillTSKILL processid | processname [/SERVER:servername] [/ID:sessionid | /A] [/V]
processid 要結束的進程的 Process ID。
processname 要結束的進程名稱。
/SERVER:servername 含有 processID 的服務器(默認值是當前值)。使用進程名和 /SERVER 時,必須指定/ID 或 /A
/ID:sessionid 結束在指定會話下運行的進程。
/A 結束在所有會話下運行的進程。
/V 顯示正在執行的操作的信息。
18、TASKKILL [/S system [/U username [/P [password]]]]
{ [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]
taskkill命令主要的好處是帶很多篩選器,可以批量結束進程
描述:
這個命令行工具可用來結束至少一個進程。可以根據進程 id 或圖像名來結束進程。
參數列表:
/S system 指定要連接到的遠程系統。
/U [domain\]user 指定應該在哪個用戶上下文執行這個命令。
/P [password] 為提供的用戶上下文指定密碼。如果忽略,提示輸入。
/F 指定要強行終止進程。
/FI filter 指定篩選進或篩選出查詢的的任務。
/PID process id 指定要終止的進程的PID。
/IM image name 指定要終止的進程的圖像名。通配符 '*'可用來指定所有圖像名。
/T Tree kill: 終止指定的進程和任何由此啟動的子進程。
篩選器:
篩選器名 有效運算符 有效值
----------- --------------- --------------
STATUS eq, ne 運行 | 沒有響應
IMAGENAME eq, ne 圖像名
PID eq, ne, gt, lt, ge, le PID 值
SESSION eq, ne, gt, lt, ge, le 會話編號
CPUTIME eq, ne, gt, lt, ge, le CPU 時間,格式為
hh:mm:ss。
hh - 時,
mm - 鍾,ss - 秒
MEMUSAGE eq, ne, gt, lt, ge, le 內存使用,單位為 KB
USERNAME eq, ne 用戶名,格式為[domain]user
MODULES eq, ne DLL 名
SERVICES eq, ne 服務名
WINDOWTITLE eq, ne 窗口標題
注意: 只有帶有篩選器的情況下,才能跟 /IM 切換使用通配符 '*'。
注意: 遠程進程總是要強行終止,不管是否指定了 /F 選項。
例如:
TASKKILL /S system /F /IM notepad.exe /T
TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
TASKKILL /F /IM notepad.exe /IM mspaint.exe
TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *
TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
19、shutdown
shutdown [-i | -l | -s | -r | -a] [-f] [-m \\\\computername] [-t xx] [-c \"mment\"] [-d up:xx:yy]
沒有參數 顯示此消息(與 ? 相同)
-i 顯示 GUI 界面,必須是第一個選項
-l 注銷(不能與選項 -m 一起使用)
-s 關閉此計算機
-r 關閉並重啟動此計算機
-a 放棄系統關機
-m \\\\computername 遠程計算機關機/重啟動/放棄
-t xx 設置關閉的超時為 xx 秒
-c \"comment\" 關閉注釋(最大 127 個字符)
-f 強制運行的應用程序關閉而沒有警告
-d [u][p]:xx:yy 關閉原因代碼
u 是用戶代碼
p 是一個計划的關閉代碼
xx 是一個主要原因代碼(小於 256 的正整數)
yy 是一個次要原因代碼(小於 65536 的正整數)
列:
shutdown /f /s /t 0 //強制立即關機
20、At
AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]
AT [\\computername] time [/INTERACTIVE]
[ /EVERY:date[,...] | /NEXT:date[,...]] "command"
\\computername 指定遠程計算機。 如果省略這個參數,會計划在本地計算機上運行命令。
id 指定給已計划命令的識別號。
/delete 刪除某個已計划的命令。如果省略 id,計算機上所有已計划的命令都會被刪除。
/yes 不需要進一步確認時,跟刪除所有作業的命令一起使用。
time 指定運行命令的時間。
/interactive 允許作業在運行時,與當時登錄的用戶桌面進行交互。
/every:date[,...] 每個月或每個星期在指定的日期運行命令。如果省略日期,則默認為在每月的本日運行。
/next:date[,...] 指定在下一個指定日期(如,下周四)運行命令。如果省略日期,則默認為在每月的本日運行。
"command" 准備運行的 Windows NT 命令或批處理程序。
例1、每月的1、5號的0點自動關機
at 00:00 /every:1,5shutdown /f /s /t 0
例2:每周一的12:00自動關機
at 12:00 /every:Monday shutdown /f /s /t 0
例3:每天12:00自動關機
at 12:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /f /s /t 0
即使用every參數,例3中的每天自動關機可以簡寫為:
at 12:00 /every:Su,M,T,W,Th,F,Sa shutdown /f /s /t 0
要取消這個定時關機的話,有兩種方法
方法一、命令行
不帶任何參數執行at,將會列出已經設定的內容,記下狀態ID號,比如本例為1,然后輸入:
at 1 /delete
也可以簡寫為:
at 1 /d
不加序列號使用/d參數將會刪除所有設定的內容,如果想不經確認刪除所有設定的內容,可用:at /d /y
21、chkdsk
chkdsk [drive:][path] filename] [/f] [/v] [/r] [/l[:size] [/x]
說明:
如果在沒有參數的情況下使用,則 chkdsk 顯示當前驅動器中的磁盤狀態。
drive: :指定要 chkdsk 檢查的磁盤所在的驅動器。
[path] filename :指定需要 chkdsk 檢查碎片整理的文件或文件集的位置和名稱。使用通配字符(* 和 ?)可以指定多個文件。
/f :修復磁盤錯誤必須鎖定磁盤。如果 chkdsk 不能鎖定驅動器,則它將在下一次重新啟動計算機時檢查該驅動器。
/v :當檢查磁盤時,顯示所有目錄中每個文件的名稱。
/r :定位壞扇區並恢復可讀取的信息。必須鎖定磁盤。
/l[:size] :僅限於 NTFS。將日志文件的大小更改為輸入的大小。如果不輸入新內容,則顯示當前大小。
/x :僅限於 NTFS。如果必要,首先強制卸載卷。然后所有對卷打開的句柄將變為無效。該開關也包含 /f 開關的功能。
/i :僅限於 NTFS。對索引項執行充分檢查,降低運行 chkdsk 的所用時間量。
/c :僅限於 NTFS。跳過文件夾結構中的周期檢查,減少運行 chkdsk 所需的時間量。
第二節 常用特殊符號
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
小技巧:添加行內注釋
%注釋內容%(可以用作行內注釋,不能出現重定向符號和管道符號)
為什么這樣呢?此時“注釋內容”其實被當作變量,其值是空的,故只起注釋作用,不過這種用法容易出現語法錯誤,一般不用。
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT set a=10 echo %a ::是在CMD命令行執行用的 echo %%a ::是在For循環中用的 echo %a% ::調用普通變量 pause
3、> 重定向符
這個字符的意思是傳遞並且覆蓋,他所起的作用是將運行的結果傳遞到后面的范圍(后邊可以是文件,也可以是默認的系統控制台)
在NT系列命令行中,重定向的作用范圍由整個命令行轉變為單個命令語句,受到了命令分隔符&,&&,||和語句塊的制約限制。
比如:
使用命令:echo hello >1.txt將建立文件1.txt,內容為”hello “(注意行尾有一空格)
使用命令:echo hello>1.txt將建立文件1.txt,內容為”hello“(注意行尾沒有空格)
4、>> 重定向符
這個符號的作用和>有點類似,但他們的區別是>>是傳遞並在文件的末尾追加,而>是覆蓋
例子:
echo hello > 1.txt echo world >>1.txt
這時候1.txt 內容如下:
hello
world
5、<、>&、<& 重定向符
這三個命令也是管道命令,但它們一般不常用,你只需要知道一下就ok了,當然如果想仔細研究的話,可以自己查一下資料。(本人已查過,網上也查不到相關資料)
< 輸入重定向命令,從文件中讀入命令輸入,而不是從鍵盤中讀入。
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT echo 2005-05-01>temp.txt date <temp.txt del temp.txt echo date pause exit
這樣就可以不等待輸入直接修改當前日期
>&,將一個句柄的輸出寫入到另一個句柄的輸入中。
<&,剛好和>&相反,從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
常用句柄:0、1、2,3—9未定義句柄:
>nul 意思是屏蔽命令輸出內容。
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 Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT set /p str=<%0 echo %str% pause exit
運行顯示批處理文件自身的第一行:@echo off
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 Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT echo 英雄^ 是^ 好^ 男人 pause exit
不用多說,自己試一下就明白了。
為什么轉義字符放在行尾可以起到續行符的作用呢?原因很簡單,因為每行末尾還有一個看不見的符號,即回車符,轉義字符位於行尾時就讓回車符失效了,從而起到了續行的作用。
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
11、"" 字符串界定符
雙引號允許在字符串中包含空格,進入一個特殊目錄可以用如下方法
cd "program files"
cd progra~1
cd pro*
以上三種方法都可以進入program files這個目錄
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盤存在,有錯誤提示,但命令仍會執行。
如果目標路徑不存在,則終止執行;如果路徑存在,僅文件不存在,則繼續執行
14、() 括號
小括號在批處理編程中有特殊的作用,左右括號必須成對使用,括號中可以包括多行命令,這些命令將被看成一個整體,視為一條命令行。
括號在for語句和if語句中常見,用來嵌套使用循環或條件語句,其實括號()也可以單獨使用,請看例子:
命令:echo 1 & echo 2 & echo 3
可以寫成:
(
echo 1
echo 2
echo 3
)
上面兩種寫法效果一樣,這兩種寫法都被視為是一條命令行。
注意:這種多條命令被視為一條命令行時,如果其中有變量,就涉及到變量延遲的問題。
15、! 感嘆號
沒啥說的,在變量延遲問題中,用來表示變量,即%var%應該表示為!var!,請看前面的setlocal命令介紹。