Xp命令解釋程序cmd.exe概述
條件處理符號(hào)
&(順序執(zhí)行命令),&&(前一個(gè)成功則執(zhí)行后一個(gè)), ||(前一個(gè)失敗執(zhí)行后一個(gè))
例子:dir&arp ;先執(zhí)行dir,接著執(zhí)行arp
dir&&arp ;dir執(zhí)行成功后,才執(zhí)行arp
dir||arp ;dir失敗(通常返回值為非0時(shí)執(zhí)行失敗),才執(zhí)行arp
環(huán)境變量
Cmd.exe
命令行解釋器環(huán)境由確定命令行解釋器和操作系統(tǒng)的行為的變量進(jìn)行定義。可以使用兩種類型的環(huán)境變量(系統(tǒng)和本地)來定義命令行解釋器環(huán)境或整個(gè)操作系統(tǒng)環(huán)境的行為。系統(tǒng)環(huán)境變量定義全局操作系統(tǒng)環(huán)境的行為。本地環(huán)境變量定義
Cmd.exe 當(dāng)前實(shí)例的環(huán)境的行為。
下表列出 Windows XP 的系統(tǒng)和局部環(huán)境變量。
變量 |
類型 |
說明 |
%ALLUSERSPROFILE% |
局部 |
返回所有“用戶配置文件”的位置。 |
%APPDATA% |
局部 |
返回默認(rèn)情況下應(yīng)用程序存儲(chǔ)數(shù)據(jù)的位置。 |
%CD% |
局部 |
返回當(dāng)前目錄字符串。 |
%CMDCMDLINE% |
局部 |
返回用來啟動(dòng)當(dāng)前的 Cmd.exe 的準(zhǔn)確命令行。 |
%CMDEXTVERSION% |
系統(tǒng) |
返回當(dāng)前的“命令處理程序擴(kuò)展”的版本號(hào)。 |
%COMPUTERNAME% |
系統(tǒng) |
返回計(jì)算機(jī)的名稱。 |
%COMSPEC% |
系統(tǒng) |
返回命令行解釋器可執(zhí)行程序的準(zhǔn)確路徑。 |
%DATE% |
系統(tǒng) |
返回當(dāng)前日期。使用與 date /t 命令相同的格式。由 Cmd.exe 生成。有關(guān) date 命令的詳細(xì)信息,請(qǐng)參閱 Date。 |
%ERRORLEVEL% |
系統(tǒng) |
返回最近使用過的命令的錯(cuò)誤代碼。通常用非零值表示錯(cuò)誤。 |
%HOMEDRIVE% |
系統(tǒng) |
返回連接到用戶主目錄的本地工作站驅(qū)動(dòng)器號(hào)。基于主目錄值的設(shè)置。用戶主目錄是在“本地用戶和組”中指定的。 |
%HOMEPATH% |
系統(tǒng) |
返回用戶主目錄的完整路徑。基于主目錄值的設(shè)置。用戶主目錄是在“本地用戶和組”中指定的。 |
%HOMESHARE% |
系統(tǒng) |
返回用戶的共享主目錄的網(wǎng)絡(luò)路徑。基于主目錄值的設(shè)置。用戶主目錄是在“本地用戶和組”中指定的。 |
%LOGONSEVER% |
局部 |
返回驗(yàn)證當(dāng)前登錄會(huì)話的域控制器的名稱。 |
%NUMBER_OF_PROCESSORS% |
系統(tǒng) |
指定安裝在計(jì)算機(jī)上的處理器的數(shù)目。 |
%OS% |
系統(tǒng) |
返回操作系統(tǒng)的名稱。Windows 2000 將操作系統(tǒng)顯示為
Windows_NT。 |
%PATH% |
系統(tǒng) |
指定可執(zhí)行文件的搜索路徑。 |
%PATHEXT% |
系統(tǒng) |
返回操作系統(tǒng)認(rèn)為可執(zhí)行的文件擴(kuò)展名的列表。 |
%PROCESSOR_ARCHITECTURE% |
系統(tǒng) |
返回處理器的芯片體系結(jié)構(gòu)。值: ,IA64。 |
%PROCESSOR_IDENTFIER% |
系統(tǒng) |
返回處理器說明。 |
%PROCESSOR_LEVEL% |
系統(tǒng) |
返回計(jì)算機(jī)上安裝的處理器的型號(hào)。 |
%PROCESSOR_LEVEL% |
系統(tǒng) |
返回處理器的版本號(hào)。 |
%PROMPT% |
局部 |
返回當(dāng)前解釋程序的命令提示符設(shè)置。由 Cmd.exe 生成。 |
%RANDOM% |
系統(tǒng) |
返回 0 到 32767 之間的任意十進(jìn)制數(shù)字。由 Cmd.exe 生成。 |
%SYSTEMDRIVE% |
系統(tǒng) |
返回包含 Windows XP 根目錄(即系統(tǒng)根目錄)的驅(qū)動(dòng)器。 |
%SYSTEMROOT% |
系統(tǒng) |
返回 Windows XP 根目錄的位置。 |
%TEMP% and %TMP% |
系統(tǒng)和用戶 |
返回對(duì)當(dāng)前登錄用戶可用的應(yīng)用程序所使用的默認(rèn)臨時(shí)目錄。有些應(yīng)用程序需要 TEMP,而其它應(yīng)用程序則需要 TMP。 |
%TIME% |
系統(tǒng) |
返回當(dāng)前時(shí)間。使用與 time /t 命令相同的格式。由 Cmd.exe 生成。有關(guān) time 命令的詳細(xì)信息,請(qǐng)參閱 Time。 |
%USERDOMAIN% |
局部 |
返回包含用戶帳戶的域的名稱。 |
%USERNAME% |
局部 |
返回當(dāng)前登錄的用戶的名稱。 |
%UserPrefix% |
局部 |
返回當(dāng)前用戶的配置文件的位置。 |
%WINDIR% |
系統(tǒng) |
返回操作系統(tǒng)目錄的位置。 |
cmd.exe可以嵌套執(zhí)行,它的每個(gè)實(shí)例都繼承其父應(yīng)用程序的環(huán)境,對(duì)新的cmd.exe實(shí)例環(huán)境的修改可以不影響父cmd.exe
批處理參數(shù)擴(kuò)展替換cmd.exe支持批處理參數(shù)擴(kuò)展替換(%0~%9), %0為當(dāng)前批處理文件名,%1為命令行第一個(gè)參數(shù),依此類推,更多的參數(shù)替換用shift命令
例:
mycopy.bat C:\Folder1 C:\Folder2
則在mycopy.bat文件內(nèi)部,執(zhí)行時(shí)所有的%0用mycopy.bat替換,%1用C:\Folder1替換 %2用C:\Folder2替換
比如,在mycopy.bat內(nèi)部命令:xcopy %1\*.* %2,擴(kuò)展后為
xcopy C:\Folder1\*.* C:\Folder2
參數(shù)替換時(shí),還可使用編輯符實(shí)現(xiàn)一些替換時(shí)的特殊處理,編輯符的格式如下:
%~[
modifier]
digit例子:
編輯符 說明
%~1 擴(kuò)展 %1 并刪除任何引號(hào) ("")。
%~f1 將 %1 擴(kuò)展到完全合格的路徑名。
%~d1 將 %1 擴(kuò)展到驅(qū)動(dòng)器盤符。
%~p1 將 %1 擴(kuò)展到路徑。
%~n1 將 %1 擴(kuò)展到文件名。
%~x1 將 %1 擴(kuò)展到文件擴(kuò)展名。
%~s1 擴(kuò)展的路徑僅包含短名稱。
%~a1 將 %1 擴(kuò)展到文件屬性。
%~t1 將 %1 擴(kuò)展到文件日期/時(shí)間。
%~z1 將 %1 擴(kuò)展到文件大小。
%~$PATH:1 搜索 PATH 環(huán)境變量中列出的目錄,并將 %1 擴(kuò)展到第一個(gè)找到的 目錄的完全合格名稱。如果沒有定義環(huán)境變量名稱,或沒有找到文 件,則此編輯符擴(kuò)展成空字符串。
編輯符和限定符的組合還可用于獲取復(fù)雜結(jié)果,所有可能組合如下:
編輯符 說明
%~dp1 將 %1 擴(kuò)展到驅(qū)動(dòng)器盤符和路徑。
%~nx1 將 %1 擴(kuò)展到文件名和擴(kuò)展名。
%~dp$PATH:1 在 PATH 環(huán)境變量列出的目錄中搜索 %1,并擴(kuò)展到第一個(gè)找到的目錄的驅(qū)動(dòng)器盤符和路徑。
%~ftza1 將 %1 擴(kuò)展到類似 dir 的輸出行。
命令重定向操作符
可以使用重定向操作符將命令輸入和輸出數(shù)據(jù)流從默認(rèn)位置重定向到不同的位置。輸入或輸出數(shù)據(jù)流的位置即為。
下表列出了可用于將命令輸入和輸出數(shù)據(jù)流進(jìn)行重定向的操作符。
重定向操作符 |
說明 |
> |
將命令輸出寫入到文件或設(shè)備(例如打印機(jī))中,而不是寫在命令提示符窗口中。 |
< |
從文件中而不是從鍵盤中讀入命令輸入。 |
>> |
將命令輸出添加到文件末尾而不刪除文件中的信息。 |
>& |
將一個(gè)句柄的輸出寫入到另一個(gè)句柄的輸入中。 |
<& |
從一個(gè)句柄讀取輸入并將其寫入到另一個(gè)句柄輸出中。 |
| |
從一個(gè)命令中讀取輸出并將其寫入另一個(gè)命令的輸入中。也稱作管道。 |
批處理核心命令:set [[
/a [
expression]] [
/p variable=[
promptString]]
string]
set命令具有的功能:創(chuàng)建,配置和查詢環(huán)境變量,表達(dá)式值計(jì)算
<>|&^是命令外殼特殊字符,字符串中出現(xiàn)這些字符時(shí)需要加escape字符(^)轉(zhuǎn)義,如
P&G, 應(yīng)為P^&G; YY||MM,應(yīng)為YY^|^|MM.
參數(shù)釋義:
/a expression開關(guān),將等號(hào)右邊的string作為可求值的數(shù)值表達(dá)式計(jì)算,按遞減優(yōu)先級(jí)支持以下操作:
運(yùn)算符 執(zhí)行的操作
< > 分組
* / % + - 算法
<< >> 邏輯移位
& 按位“與”運(yùn)算
^ 按位“異或”運(yùn)算
| 按位“或”運(yùn)算
= *= /= %= += -= &= ^= |= <<= >>= 分配
, 表達(dá)式分隔符
string作為表達(dá)式求值時(shí),出現(xiàn)的非數(shù)值字符默認(rèn)為環(huán)境變量名,并將其值轉(zhuǎn)換為數(shù)字后再進(jìn)行處理,不存在的環(huán)境變量自動(dòng)作為0處理。取值時(shí)無需再加%。
表達(dá)式中的數(shù)字支持16進(jìn)制和8進(jìn)制形式,16進(jìn)制數(shù)以0x開頭,8進(jìn)制以0開頭,因此08..和09..是非法數(shù),因?yàn)?進(jìn)制數(shù)沒有8和9兩個(gè)digit。
/p開關(guān),允許將用戶輸入設(shè)置為變量variable的值,讀取輸入前系統(tǒng)會(huì)顯示指定的promptString, promptString可以為空
例子:set /p myExpression=Please input a expression:
set /a myResult=%myExpression%
則myResult中保存的即為輸入表達(dá)式的值
set命令的簡單用法為
set [
variable[
=[
string]]],可完成的功能為查詢、新建、更改或者刪除環(huán)境變量
For命令格式如下:
for {%
variable|%%
variable}
in (
set)
do command [
CommandLineOption ]
注釋:
下列屬性適用于 for 命令:
for 命令使用指定 set 中的每個(gè)文本字符串替換 %variable 或 %%variable,直到 command 處理所有文件為止。
記住,for variable名是區(qū)分大小寫、全局的,并且每次總共不超過 52 個(gè)是活動(dòng)的。
要避免批處理參數(shù)從 %0 到 %9 混淆,對(duì) variable 可以使用除數(shù)字 0 到 9 之外的任何字符。對(duì)于簡單的批處理文件,單個(gè)字符即可奏效,例如 %%f。
在復(fù)雜的批處理文件中可以使用 variable 的多個(gè)值來區(qū)分不同的可替換變量。
set 參數(shù)可以代表單個(gè)或多個(gè)文件組。可以使用通配符(即,* 和 ?)指定文件組。以下為有效文件組:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
在使用 for 命令時(shí),set 中的第一個(gè)值代替 %variable 或 %%variable,然后由指定的命令處理該值。這一直會(huì)繼續(xù)下去,直到處理完與 set 值相對(duì)應(yīng)的所有文件(或文件組)為止。
In 和 do 不是參數(shù),但必須將它們與 for 一起使用。如果省略其中任何一個(gè)關(guān)鍵字,就會(huì)出現(xiàn)錯(cuò)誤消息。
如果命令擴(kuò)展名處于啟用狀態(tài)(即,默認(rèn)設(shè)置),則支持 for 的下列其它形式:
僅為目錄
如果 set 包含通配符(* 和 ?),則為匹配 set 的每個(gè)目錄(而不是指定目錄中的文件組)而執(zhí)行指定的 command。語法是:
for /D {%% | %}variable in (set) do command [CommandLineOptions]
遞歸
進(jìn)入根目錄樹 [Drive:]Path,在樹的每個(gè)目錄中執(zhí)行 for 語句。如果在 /R 后沒有指定目錄,則假定為當(dāng)前目錄。如果 set 只是一個(gè)句號(hào) (.),則只列舉目錄樹。語法是:
for /R [[Drive :]Path] {%% | %}variable in (set) do command [CommandLineOptions]
重復(fù)數(shù)值范圍
使用迭代變量設(shè)置起始值 (start#) ,然后一步步執(zhí)行一系列設(shè)置范圍的值,直到該值超過設(shè)置的終止值 (end#)。/L 將通過對(duì) start# 與 end# 進(jìn)行比較,執(zhí)行迭代變量。如果 start# 小于 end#,就會(huì)執(zhí)行該命令。如果迭代變量超過 end#,則命令解釋程序退出此循環(huán)。也可以使用負(fù) step# 以遞減數(shù)值的方式一步步執(zhí)行此范圍內(nèi)的值。例如,(1,1,5) 生成順序 1 2 3 4 5,而 (5,-1,1) 則生成順序 (5 4 3 2 1)。語法是:
for /L {%% | %}variable in (start#,step#,end#) do command [CommandLineOptions]
重復(fù)和文件解析
使用文件解析過程處理命令輸出、字符串和文件內(nèi)容。使用迭代變量定義要檢查的內(nèi)容或字符串,以及使用各種 ParsingKeywords 選項(xiàng)進(jìn)一步修改解析方式。使用 ParsingKeywords 令牌選項(xiàng)指定哪些令牌應(yīng)該傳遞為迭代程序變量。注意:在沒有使用令牌選項(xiàng)時(shí),/F 將僅檢查第一個(gè)令牌。
文件解析過程包括讀取輸出、字符串或文件內(nèi)容、分成獨(dú)立的文本行及然后將每行解析成零個(gè)或更多個(gè)令牌。然后通過設(shè)置為令牌的迭代程序變量值,調(diào)用 for 循環(huán)。默認(rèn)情況下,/F 傳遞每個(gè)文件每一行的第一個(gè)空白分隔符號(hào)。跳過空行。語法的不同點(diǎn)為:
for /F ["ParsingKeywords"] {%% | %}variable in (filenameset) do command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}variable in ("LiteralString") do command [CommandLineOptions]
for /F ["ParsingKeywords"] {%% | %}variable in ('command') do command [CommandLineOptions]
filenameset 參數(shù)指定一個(gè)或多個(gè)文件名稱。在繼續(xù)到 filenameset 中的下一個(gè)文件之前,每個(gè)文件都會(huì)被打開、讀取和處理。要覆蓋默認(rèn)解析行為,指定 "ParsingKeywords"。這是一個(gè)引用字符串,它包含一個(gè)或多個(gè)關(guān)鍵字以指定不同的解析選項(xiàng)。
如果使用 usebackq(use back quoted, 后引號(hào)`) 選項(xiàng),請(qǐng)使用如下語法之一:
for /F ["usebackqParsingKeywords"] {%% | %}variable in ("filenameset") do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in ('LiteralString') do command [CommandLineOptions]
for /F ["usebackqParsingKeywords"] {%% | %}variable in (`command`) do command [CommandLineOptions]
下表列出可以用于 ParsingKeywords 的解析關(guān)鍵字。
關(guān)鍵字 說明
eol=c 指定行尾字符(只一個(gè)字符)。
skip=n 指定在文件的開頭跳過的行數(shù)。
delims=xxx 指定定界符集合。這將替換空格和制表符的默認(rèn)分隔符集。
tokens=x,y,m-n 指定將哪些令牌從每行傳遞到每個(gè)迭代的 for 正文。結(jié)果就分配了附加變量名稱。m-n 格式是一個(gè)范圍
,指定從 mth 到 nth 的令牌。如果 tokens=字符串中最后一個(gè)字符是星號(hào) (*),則將分配附加的變量,并在解析的最后一個(gè)令牌后在行上接收剩余的文本。
usebackq 指定可以使用引號(hào)引用 filenameset 中的文件名稱,將后面帶有引號(hào)的字符串作為一個(gè)命令執(zhí)行,而帶有 單引號(hào)的字符串是文字字符串命令。
解析字符串
通過將 Filenameset 包括在圓括號(hào)內(nèi),并且外面再帶上單引號(hào)(即,'filenameset'),可以使用 for /F 對(duì)直接字符串解析邏輯。將 Filenameset 視為從某個(gè)文件輸入的單行,然后接受解析。
解析輸出
通過將圓括號(hào)之間的 filenameset 變?yōu)楹竺鎺в幸?hào)的字符串,可以利用 for /F 命令解析命令輸出。將它作為命令行,此命令被傳遞給子 Cmd.exe,并將輸出捕獲到內(nèi)存并進(jìn)行解析,就象它是一個(gè)文件一樣。
例子:
for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k
這個(gè)命令解析 myfile.txt 文件的每一行,忽略以分號(hào)開頭的行(注意eol只對(duì)一行起始字符有效,行中其他位置出現(xiàn)該字符并不會(huì)忽略后面的字符),將第二和第三個(gè)令牌從各行傳遞到 FOR 正文(令牌通過逗號(hào)或空格分隔)中。FOR 語句的正文引用 %i 以獲得第二個(gè)令牌,引用 %j 以獲得第三個(gè)令牌,引用 %k 以獲得其余全部令牌。如果您提供的文件名包含空格,請(qǐng)使用引號(hào)將文本引起來(例如,"File Name")。要使用引號(hào),必須使用 usebackq。否則,就將引號(hào)解釋為定義要解析的文字字符串。
%i 在 FOR 語句中明確聲明,并且 %j 和 %k 使用 tokens= 隱含聲明。只要它不會(huì)引起嘗試聲明高于字母“z”或“Z”的某個(gè)變量,則使用 tokens= 可以指定最多 26 個(gè)令牌。
要通過將 filenameset 放在括號(hào)之間來解析命令輸出,請(qǐng)鍵入:
for /F "usebackq delims==" %i IN (`set`) DO @echo %i
這個(gè)范例列舉當(dāng)前環(huán)境中的環(huán)境變量名。
例子:文件namelist.txt的內(nèi)容為:
01.xxxx
...
13.xxxx
同目錄下有Track01.mp3~Track13.mp3等文件,則執(zhí)行下面命令:
@echo off
if exist namelist.txt for /F "delims=. tokens=1,2" %%i in (namelist.txt) do if exist \ Track%%i.mp3 rename Track%%i.mp3 "%%i.%%j.mp3"
pause
結(jié)果為按namelist.txt的名字批量重命名Track*.mp3為相應(yīng)的名字