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