Windows 批處理指令碼
本書描述並展示瞭如何使用 Microsoft 提供的命令直譯器 cmd.exe 及其關聯的命令,以及如何為直譯器編寫 Windows 批處理指令碼。cmd.exe 是所有基於 Windows NT 的作業系統的預設直譯器,包括 Windows XP、Windows 7 和 Windows 10。
本書討論了適用於基於 Windows NT 環境的現代 Windows 版本的 32 位 Windows 命令。它不討論特定於 DOS 環境和基於 DOS 的作業系統的命令,例如 Windows 95、Windows 98 和 Windows Me,它們的 Microsoft 提供的命令直譯器實際上是 DOS 程式,而不是 Win32 程式。
您可以使用 VER 命令找出正在執行的 Windows 版本。
本書首先介紹了 Windows NT 命令直譯器的使用,以及它如何接收、解析和處理來自使用者的命令。然後,它將介紹各種可用的命令。
要獲取 Windows 命令及其簡要摘要的完整列表,請在任何 Windows 計算機上開啟命令提示符,並鍵入help。要查詢有關特定命令的資訊,請鍵入命令名稱後跟 “/?”。
本書的主題也稱為“批處理程式設計”,即使“批處理”不僅指 MS DOS 和 Windows 命令直譯器的批處理檔案。其他主題術語包括“批處理檔案程式設計”、“批處理檔案指令碼”、“Windows 批處理命令”、“Windows 批處理檔案”、“Windows 命令列”、“Windows 命令提示符”和“Windows shell 指令碼”。
對於 Windows 指令碼,cmd.exe 是一種遺留技術;現代等效項是 PowerShell,它基於 .NET,其用於管道的流是物件,而不是字元(位元組)流。PowerShell 的功能遠遠超過 cmd.exe;PowerShell 具有完整程式語言的功能,包括變數的型別化內容、浮點運算、大整數、透過 .NET 類進行 GUI 程式設計等。儘管如此,cmd.exe 仍然適用於簡單的指令碼和命令列互動任務,通常提供更短的語法和更快的啟動時間,並且可以與從其他作業系統熟悉的字元流管道一起使用。cmd.exe 可以透過從其他作業系統中已知的命令來增強;請參閱 #Unix 命令。另一個用於 Windows 指令碼的替代方案是流行的 Python,它使用其 pywin32 和 wmi 庫;但是,這需要安裝。
將命令列解析為一系列命令是一個複雜的過程。主要有四個部分:
- 變數替換:掃描命令列以查詢變數規範,找到的任何變數規範都將替換為這些變數的內容。
- 引用:特殊字元可以被引用,以消除其特殊含義。
- 語法:命令列根據語法被解析為一系列命令。
- 重定向:在執行序列中的單個命令之前,將應用重定向規範,並將其從命令列中刪除。
命令列可以包含變數規範。這些規範包括一個 % 字元,後跟一個名稱,然後是一個第二個 % 字元,除非該名稱是 0 ... 9 中的數字或星號 *。
變數規範將被替換為以下值:
- %varname%,例如 %PATH% 或 %USERNAME%,將被替換為命名環境變數的值。例如,%PATH% 將被替換為 PATH 環境變數的值。變數名稱匹配不區分大小寫:%PATH% 和 %path% 具有相同的效果。
- %n for 0 <= n <= 9,例如 %0 或 %9,將被替換為呼叫批處理檔案時傳遞給批處理檔案的第 n 個引數的值,受 SHIFT 命令的任何後續修改的影響。例如:%2 將被替換為第二個批處理檔案引數的值。在互動式使用中(在批處理之外),這種情況不會發生替換。
- %* 將被替換為除 %0 之外的所有命令列引數的值,即使是超過索引 9 的引數。 SHIFT 命令不會影響 %* 的結果。另請參見 命令列引數。在互動式使用中(在批處理之外),這種情況不會發生替換。
某些變數名稱使用 SET 命令不可見。相反,它們可以透過 % 符號進行讀取。要了解這些名稱,請鍵入 "help set"。
特殊變數名稱及其展開內容
| 名稱 | 使用的替換值 |
|---|---|
| %CD% | 當前目錄,如果它不是當前驅動器的根目錄,則不以斜槓字元結尾。另請參見 #CD。 |
| %TIME% | 系統時間,格式為 HH:MM:SS.mm,除非區域設定規定了其他格式。另請參見 #TIME。 |
| %DATE% | 系統日期,以特定於本地化的格式顯示。另請參見 #DATE。 |
| %RANDOM% | 生成的偽隨機數,介於 0 到 32767 之間。另請參見 #計算。 |
| %ERRORLEVEL% | 最後執行的命令或最後呼叫的批處理指令碼返回的錯誤級別。另請參見 #錯誤級別。 |
| %CMDEXTVERSION% | cmd.exe 當前使用的命令處理器擴充套件的版本號。 |
| %CMDCMDLINE% | 啟動當前 cmd.exe 時使用的命令列的內容。 |
連結
- Windows 環境變數,位於 ss64.com
- 命令 shell 概述,位於 TechNet / Microsoft Docs
您可以阻止控制命令語法的特殊字元具有其特殊含義,但百分號 (%) 除外。
- 您可以用引號將包含特殊字元的字串括起來。
- 您可以在特殊字元之前立即放置脫字元號 (^),這是一個跳脫字元。在管道 (|) 後的命令中,您需要使用三個脫字元號 (^^^) 才能使其生效。
需要引用或轉義的特殊字元通常是 <、>、|、& 和 ^。在某些情況下,! 和 \ 也可能需要轉義。換行符也可以用脫字元號轉義。
使用引號將字串括起來時,引號會成為傳遞給呼叫的命令的引數的一部分。相反,使用脫字元號作為跳脫字元時,脫字元號不會成為傳遞給的引數的一部分。
百分號 (%) 是一種特殊情況。在命令列中,它不需要引用或轉義,除非使用兩個百分號來表示變數,例如 %OS%。但在批處理檔案中,您必須使用雙百分號 (%%) 才能產生一個百分號 (%)。將百分號括在引號中或在其前面加脫字元號無效。
示例
- echo "Johnson & son"
- 回顯完整字串,而不是在 & 字元處拆分命令列。引號也將回顯。
- echo Johnson ^& son
- 如上所示,但在特殊字元和號之前使用脫字元號。不會回顯任何引號。
- echo Johnson & son
- 不使用跳脫字元,因此 "son" 被解釋為一個單獨的命令,通常會導致錯誤訊息,即找不到命令 son。
- echo A ^^ B
- 回顯 A ^ B。脫字元號也需要轉義,否則它將被解釋為轉義空格。
- echo > NUL | echo A ^^^^ B
- 回顯 A ^ B。在管道之後,用於轉義的脫字元號需要重複三次才能生效;第四個脫字元號是正在轉義的脫字元號。
- if 1 equ 1 ^
echo Equal &^
echo Indeed, equal- 回顯這兩個字串。行尾的脫字元號會轉義換行符,導致三行被視為一行。第一個脫字元號前的空格是必需的,否則 1 會與後面的 echo 結合,形成 1echo。
- attrib File^ 1.txt
- 不顯示名為 "File 1.txt" 的檔案的屬性,因為空格的轉義不起作用。使用引號,如 attrib "File 1.txt",可以正常工作。
- echo The ratio was 47%.
- 如果從批處理檔案執行,則會忽略百分號。
- echo The ratio was 47%%.
- 如果從批處理檔案執行,則百分號會輸出一次。
- set /a modulo=14%%3
- 如果從批處理檔案執行,則將 modulo 變數設定為 2,即 14 除以 3 的餘數。使用單個 % 無效。
- for %%i in (1,2,3) do echo %%i
- 如果從批處理檔案執行,則會輸出 1、2 和 3。
- echo %temp%
- 即使從批處理檔案執行,也會輸出 temp 變數的內容。在批處理中使用百分號訪問環境變數和傳遞的引數不需要轉義。
- echo ^%temp^%
- 從命令列執行時,會逐字輸出 %temp%。
- echo %%temp%%
- 從批處理檔案執行時,會逐字輸出 %temp%。
- echo //comment line | findstr \//
- 命令 FINDSTR 使用反斜槓 (\) 進行轉義。與脫字元號不同,這在命令內部進行,命令 shell 無法識別。
連結
- 語法:跳脫字元、分隔符和引號,位於 ss64
- 命令 shell 概述,位於 Microsoft
- set,位於 Microsoft
命令列根據語法被解析為一系列命令。在該語法中,簡單命令可以組合形成管道,而管道又可以組合形成複合命令,最終可以轉換為帶括號的命令。
簡單命令只是一個命令名、命令尾部和一些重定向規範。簡單命令的示例如下:dir *.txt > somefile.
管道是幾個簡單命令透過 "管道" 元字元 "|" 連線在一起,也稱為 "豎線"。每個豎線之前的簡單命令的標準輸出透過管道連線到其後面的簡單命令的標準輸入。命令直譯器並行執行管道中的所有簡單命令。管道(包含兩個簡單命令)的示例如下:dir *.txt | more.
複合命令是一組由連線詞分隔的管道。管道按順序執行,一個接一個,連線詞控制命令直譯器是否執行下一個管道。複合命令(包含兩個管道,而管道本身只是簡單命令)的示例如下:move file.txt file.bak && dir > file.txt.
連線詞
- & - 無條件連線詞。當前管道執行完畢後,始終執行下一個管道。
- && - 正向條件連線詞。如果當前管道以零退出狀態執行完畢,則執行下一個管道。
- || - 負向條件連線詞。如果當前管道以非零退出狀態執行完畢,則執行下一個管道。
帶括號的命令是括在括號中的複合命令(即(和))。從語法的角度來看,這將複合命令轉換為簡單命令,其整體輸出可以重定向。
例如:命令列( pushd temp & dir & popd ) > somefile會導致整個複合命令的標準輸出( pushd temp & dir & popd )被重定向到 somefile。
連結
- 條件執行,位於 ss64.com
- 使用圓括號/方括號對錶達式進行分組,位於 ss64.com
- 命令 shell 概述,位於 TechNet / Microsoft Docs
重定向
[edit | edit source]重定向規範在執行命令序列中的單個命令之前應用並從命令列中刪除。重定向規範控制簡單命令的標準輸入、標準輸出和標準錯誤檔案控制代碼指向的位置。它們會覆蓋可能由管道產生的對這些檔案控制代碼的任何影響。(請參閱前一節有關命令語法的部分。)重定向符號 > 和 >> 可以加上字首 1 表示標準輸出(與沒有字首相同)或 2 表示標準錯誤。
重定向規範如下:
- < filename
- 將標準輸入重定向為從指定檔案讀取。
- > filename
- 將標準輸出重定向為寫入指定檔案,覆蓋其先前內容。
- >> filename
- 將標準輸出重定向為寫入指定檔案,追加到其先前內容的末尾。
- >&h
- 重定向到控制代碼 h,其中控制代碼可以是 0(標準輸入)、1(標準輸出)、2(標準錯誤)等等。
- <&h
- 從控制代碼 h 重定向。
示例
- dir *.txt >listing.log
- 將 dir 命令的輸出重定向到 listing.log 檔案。
- dir *.txt > listing.log
- 與上面相同;檔名前面的空格沒有區別。但是,如果在命令視窗中鍵入此命令,在鍵入 "> l" 後使用 Tab 鍵進行自動完成實際上可以工作,而使用 ">listing.log" 則無法工作。
- dir *.txt 2>NUL
- 將 dir 命令的錯誤重定向到無處。
- dir *.txt >>listing.log
- 將 dir 命令的輸出重定向到 listing.log 檔案,追加到檔案。這樣,在執行重定向命令之前檔案的內容就不會丟失。
- dir *.txt >listing.log 2>&1
- 將 dir 命令的輸出重定向到 listing.log 檔案,以及錯誤訊息。
- dir *.txt >listing.log 2>listing-errors.log
- 將 dir 命令的輸出重定向到 listing.log 檔案,並將錯誤訊息重定向到 listing-errors.log 檔案。
- >myfile.txt echo Hello
- 重定向可以在命令之前。
- echo Hello & echo World >myfile.txt
- 只有第二個 echo 被重定向。
- (echo Hello & echo World) >myfile.txt
- 兩個 echo 的輸出都被重定向。
- type con >myfile.txt
- 將控制檯輸入 (con) 重定向到檔案。因此,允許使用者輸入多行,使用者按 Control + Z 鍵結束。另請參閱 #使用者輸入。
- (for %i in (1,2,3) do @echo %i) > myfile.txt
- 將迴圈的整個輸出重定向到檔案。
- for %i in (1,2,3) do @echo %i > myfile.txt
- 每次進入迴圈體時都會重新開始重定向,從而丟失除最新迴圈迭代之外的所有輸出。
連結
如何執行命令
[edit | edit source](...)
批處理重新載入
[edit | edit source]命令直譯器在每次執行一行或括號組之後重新載入批處理的內容。
如果啟動以下批處理並在啟動後不久將“echo A”更改為“echo B”,則輸出將為 B。
@echo off ping -n 6 127.0.0.1 >nul & REM wait echo A
單行上的內容很重要;在執行以下批處理後更改“echo A”不會產生任何影響
@echo off ping -n 6 127.0.0.1 >nul & echo A
啟動後更改對用 ( 和 ) 括起來的命令沒有任何影響。因此,在啟動以下批處理後更改“echo A”不會產生任何影響
@echo off for /L %%i in (1,1,10) do ( ping -n 2 127.0.0.1 >nul & REM wait echo A )
對於任何其他包含,包括此包含,也是如此
@echo off ( ping -n 6 127.0.0.1 >nul & REM wait echo A )
環境變數
[edit | edit source]命令直譯器程序的環境變數被其執行的任何(外部)命令的程序繼承。一些環境變數由命令直譯器本身使用。更改它們會改變其操作。
環境變數受 SET、PATH 和 PROMPT 命令的影響。
要取消設定變數,請將其設定為空字串,例如“set myvar=”。
命令直譯器從建立它的程序繼承其初始環境變數集。例如,對於從桌面快捷方式呼叫的命令直譯器,這將是 Windows 資源管理器。
命令直譯器通常具有文字使用者介面,而不是圖形使用者介面,因此不識別通知應用程式登錄檔中的環境變數模板已更改的 Windows 訊息。更改控制面板中的環境變數會導致 Windows 資源管理器從登錄檔中的模板更新其自身環境變數,從而更改任何隨後呼叫的命令直譯器將繼承的環境變數。但是,它不會導致正在執行的命令直譯器從登錄檔中的模板更新其環境變數。
另請參閱 #變數替換。
連結
- Windows 環境變數,位於 ss64.com
- 命令 shell 概述,位於 TechNet / Microsoft Docs
COMSPEC
[edit | edit source]COMSPEC 環境變數包含命令直譯器程式檔案的完整路徑名。這只是從父程序繼承的,因此間接地從登錄檔中環境變數模板的 COMSPEC 設定派生。
PATH
[edit | edit source]PATH 環境變數的值包含一個目錄名稱列表,由分號字元隔開。這是在定位要執行的外部命令的程式檔案時按順序搜尋的目錄列表。
PATHEXT
[edit | edit source]PATHEXT 環境變數的值是一個檔名擴充套件列表,由分號 (;) 隔開。這是在定位要執行的外部命令的程式檔案時按順序應用的檔名擴充套件列表。
由“echo %PATHEXT%”列印的 PATHEXT 的示例內容
- .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
透過將“.PL”新增到變數,可以確保 Perl 程式即使在沒有“.pl”副檔名的情況下從命令列執行。因此,無需鍵入“mydiff.pl a.txt b.txt”,就可以鍵入“mydiff a.txt b.txt”。
在 Windows Vista 及更高版本中將“.PL”新增到變數
- setx PATHEXT %PATHEXT%;.PL
- 如果使用 Windows XP 中可用的“set”,則效果將是暫時的,並且僅影響當前控制檯或程序。
連結
PROMPT
[edit | edit source]PROMPT 環境變數控制命令直譯器在顯示提示時發出的文字。命令直譯器在互動模式下提示輸入新命令列時,或在批處理檔案模式下回顯批處理檔案行時顯示提示。
PROMPT 環境變數值中的各種特殊字元序列會導致在顯示提示時產生各種特殊效果,如以下表格所示
| 字元 | 展開結果 |
|---|---|
| $$ | $ 字元本身 |
| $A | & 符號,即和號。這是一個便利,因為很難在 PROMPT 環境變數的值中使用 SET 命令放置一個字面量&。 |
| $B | 垂直線 '|'(管道符號) |
| $C | 左括號 '(' |
| $D | 當前日期 |
| $E | ESC(ASCII 碼 27) |
| $F | 右括號 ')' |
| $G | 大於號 '>' |
| $H | 退格鍵(刪除前一個字元) |
| $L | 小於號 '<' |
| $M | 如果當前驅動器是網路驅動器,則連結到當前驅動器的遠端名稱;否則為空字串。 |
| $N | 當前驅動器磁碟機代號 |
| $P | 當前驅動器磁碟機代號和完整路徑 |
| $Q | '='(等於號) |
| $S | ' '(空格字元) |
| $T | 當前系統時間 |
| $V | Windows 版本號 |
| $_ | <CR>(回車符,又稱“Enter”) |
| $+ | 與 pushd 目錄堆疊中的專案數量一樣多的加號 (+) |
連結
開關
[edit | edit source]大多數 Windows 命令提供開關,也稱為選項,以指導其行為。
觀察結果
- 開關通常由單個字母組成;一些開關由多個字母的序列組成。
- 開關前面是斜槓 (/),而不是像在某些其他作業系統中那樣用減號 (-)。
- 開關不區分大小寫,而不是像在某些其他作業系統中那樣區分大小寫。
- 如果將來自另一個作業系統的命令移植到 Windows(例如 grep),它通常會保留來自原始作業系統的選項約定,包括使用減號和區分大小寫。
示例
- dir /?
- 輸出幫助。此選項由許多命令提供。
- dir /b /s
- 以遞迴方式列出當前資料夾中的所有檔案和資料夾。使用兩個開關:b 和 s。
- dir /bs
- 不起作用;開關不能累積在單個斜槓後面。
- findstr /ric:"id: *[0-9]*" File.txt
- 與許多其他命令不同,findstr 允許在單個斜槓後累積開關。實際上,r、i 和 c 是單字母開關。
- dir/b/s
- 有效。在 dir 中,刪除命令和第一個開關之間或開關之間的空格沒有區別;因此,與 dir /b /s 相同。
- tree/f/a
- 無效,與 tree /f /a 不同。在 tree 中,空格分隔是強制性的。find/i/v 也不起作用。
- dir /od
- 開關字母 o 由單個字母進一步修改,該字母指定排序應按日期進行。字母 d 本身不是開關。類似的情況包括 dir /ad 和 more /t4。
- dir /B /S
- 開關不區分大小寫,與其他一些作業系統不同。
- sort /r file.txt
- 以相反的順序對檔案進行排序。
- sort /reverse file.txt
- Sort 允許開關字串的長度超過單個字母。
- sort /reve file.txt
- Sort 允許指定的開關字串是開關完整長名稱的子字串。因此,與上面的相同。
- sort /reva file.txt
- 無效,因為“reva”不是“reverse”的子字串。
- taskkill /im AcroRd32.exe
- Taskkill 要求 /im 使用多字母開關名稱;縮短為 /i 無效。
- java -version
- Java 誕生於另一個作業系統系列的環境中,使用減號約定表示其開關,也稱為選項。
- grep --help
- 如果安裝了 GNU grep,則它要求多字母開關之前有兩個連字元。
錯誤級別
[edit | edit source]命令通常在執行結束時設定錯誤級別。在 Windows NT 及更高版本中,它是一個 32 位有符號整數;在 MS DOS 中,它曾經是一個從 0 到 255 的整數。關鍵詞:返回值、退出程式碼、退出狀態。
錯誤級別的傳統含義
- 0 - 成功
- 非 0 - 失敗
- 設定的錯誤級別通常為正數。
- 如果命令不區分各種失敗型別,則失敗時的錯誤級別通常為 1。
錯誤級別的用途
示例
- dir >NUL && echo Success
- 只有在錯誤級別為零時才執行 && 後的部分。
- color 00 || echo Failure
- 只有在錯誤級別為非零時才執行 || 後的部分,無論是正數還是負數。
- color 00 || (
echo Failure
)- 多行括號也能正常工作。
- echo %ERRORLEVEL%
- 輸出錯誤級別而不改變它。
- if %errorlevel% equ 0 echo 錯誤級別為零,表示成功。
- if %errorlevel% neq 0 echo 錯誤級別為非零,表示失敗。
- if errorlevel 1 echo 錯誤級別 >= 1,表示透過正錯誤級別失敗。
- 不包含透過負錯誤級別失敗的情況。注意“>=”部分:這與 if %errorlevel% equ 1 不同。
- exit /b 1
- 返回批處理檔案,將錯誤級別設定為 1。
- cmd /c "exit /b 10"
- 在批處理檔案中間或命令列上,將錯誤級別設定為 10。
- (cmd /c "exit /b 0" && Echo Success) & (cmd /c "exit /b -1" || Echo Failure)
- 如上所示,表明錯誤級別確實受到了影響。
- (cmd /c "exit /b 0" & cmd /c "exit /b 1") || Echo Failure
- 由 & 建立的鏈的錯誤級別是鏈中最後一個命令的錯誤級別。
- cmd /c "exit /b -1" & if not errorlevel 1 echo Would-be success
- “if not errorlevel 1”測試似乎測試成功,但對負數透過:它測試“非錯誤級別 >= 1”,即“錯誤級別 <= 0”。
- set myerrorlevel=%errorlevel%
- 記住錯誤級別以備後用。
- set errorlevel=0
- 應避免:掩蓋內建的 errorlevel 變數。確保隨後透過 %ERRORLEVEL% 的訪問返回 0 而不是實際錯誤級別。
- cmd /c "exit /b 0"
if 1 equ 1 ( cmd /c "exit /b 1" & echo %errorlevel% )- 輸出 0,因為 %errorlevel% 在 cmd /c "exit /b 1" 執行之前擴充套件。
連結
字串處理
[edit | edit source]獲取非空變數的子字串
set a=abcdefgh
echo %a:~0,1% & rem from index 0, length 1; result: a
echo %a:~1,1% & rem from index 1, length 1; result: b
echo %a:~0,2% & rem from index 0, length 2; result: ab
echo %a:~1,2% & rem from index 1, length 2; result: bc
echo %a:~1% & rem from index 1 to the end; result: bcdefgh
echo %a:~-1% & rem from index -1 (last char) to the end; result: h
echo %a:~-2% & rem from index -2 (next-to-last) to the end; result: gh
echo %a:~0,-2% & rem from index 0 to index -2, excl.; result: abcdef
echo %a:~0,-1% & rem from index 0 to index -1, excl.; result: abcdefg
echo %a:~1,-1% & rem from index 1 to index -1, excl.; result: bcdefg
測試子字串包含
- if not "%a:bc=%"=="%a%" echo yes
- 如果變數 a 包含“bc”作為子字串,則回顯“yes”。
- 此測試是一個使用字串替換的技巧,將在下面討論。
- 如果變數包含引號,此測試將不起作用。
測試“以...開頭”
if %a:~0,1%==a echo yes & rem If variable a starts with "a", echo "yes".
if %a:~0,2%==ab echo yes & rem If variable a starts with "ab", echo "yes".
字串替換
set a=abcd & echo %a:c=% & rem replace c with nothing; result: abd
set a=abcd & echo %a:c=e% & rem replace c with e; result: abed;
set a=abcd & echo %a:*c=% & rem replace all up to c with nothing; result: d
rem Above, the asterisk (*) only works at the beginning of the sought pattern.
另見 SET 命令的幫助:set /?。
透過“ ”、“,”和“;”中的任何一個拆分字串:[“空格”、“逗號”和“分號”:]
set myvar=a b,c;d
for %%a in (%myvar%) do echo %%a
透過分號拆分字串,假設字串不包含引號
@echo off
set myvar=a b;c;d
set strippedvar=%myvar%
:repeat
for /f "delims=;" %%a in ("%strippedvar%") do echo %%a
set prestrippedvar=%strippedvar%
set strippedvar=%strippedvar:*;=%
if not "%prestrippedvar:;=%"=="%prestrippedvar%" goto :repeat
限制
- 上述字串處理不適用於引數變數(%1、%2 等)。
連結
命令列引數
[edit | edit source]傳遞給批處理指令碼的命令列引數,也稱為命令列引數,可以透過 %1、%2、...、%9 訪問。可能存在超過九個引數;要訪問它們,請參閱下面如何迴圈遍歷所有引數。
語法 %0 不引用命令列引數,而是引用批處理檔案的名稱。
測試是否已提供第一個命令列引數
if not -%1-==-- echo Argument one provided
if -%1-==-- echo Argument one not provided & exit /b
使用 SHIFT 對所有命令列引數進行穩健迴圈(對於每個命令列引數,...)
:argactionstart
if -%1-==-- goto argactionend
echo %1 & REM Or do any other thing with the argument
shift
goto argactionstart
:argactionend
使用 SHIFT 對所有命令列引數進行穩健迴圈,而不修改 %1、%2 等。
call :argactionstart %*
echo Arg one: %1 & REM %1, %2, etc. are unmodified in this location
exit /b
:argactionstart
if -%1-==-- goto argactionend
echo %1 & REM Or do any other thing with the argument
shift
goto argactionstart
:argactionend
exit /b
將命令列引數傳輸到環境變數
setlocal EnableDelayedExpansion
REM Prevent affecting possible callers of the batch
REM Without delayed expansion, !arg%argno%! used below won't work.
set argcount=0
:argactionstart
if -%1-==-- goto argactionend
set /a argcount+=1
set arg%argcount%=%1
shift
goto argactionstart
:argactionend
set argno=0
:loopstart
set /a argno+=1
if %argno% gtr %argcount% goto loopend
echo !arg%argno%! & REM Or do any other thing with the argument
goto loopstart
:loopend
迴圈遍歷所有命令列引數,雖然不是穩健的
for %%i in (%*) do (
echo %%i
)
這看起來很優雅,但並不穩健,會錯誤處理包含萬用字元(*、?)的引數。特別是,上面的 for 命令用匹配它們的檔名替換包含萬用字元(*、?)的引數,或者如果沒有任何檔案匹配則刪除它們。儘管如此,只要傳遞的引數不包含萬用字元,上面的迴圈就能按預期工作。
以非穩健的方式查詢命令列引數的數量
set argcount=0
for %%i in (%*) do set /a argcount+=1
同樣,這對於包含萬用字元的引數不起作用。
最大可能的引數數量大於 4000,如在 Windows Vista 機器上透過經驗確定。該數量在 Windows XP 和 Windows 7 上可能會有所不同。
在將引數傳遞給批處理指令碼時,用於引數分隔的字元是以下這些
- 空格
- 逗號
- 分號
- 等號
- 製表符
因此,以下行傳遞了相同的四個引數
- test.bat a b c d
- test.bat a,b,c,d
- test.bat a, b, c, d
- test.bat a;b;c;d
- test.bat a=b=c=d
- test.bat a b,c;,;=d
是的,即使包含“a b,c;,;=d”的行也傳遞了四個引數,因為一系列分隔符被視為單個分隔符。
要在引數值中包含空格、逗號或分號,可以將值括在引號中。但是,引號將成為引數值的一部分。要在指令碼中引用該引數時去掉包含的引號,可以使用 #百分號波浪號 中描述的 %~<number>。
在將引數傳遞給呼叫的命令而不是批處理指令碼時,通常需要使用空格將命令與第一個引數分隔開。但是,對於內部命令,如果命令名稱後的第一個字元是幾個符號之一,包括 .\/ 等等,則不需要這種分隔。
- echo.
- 輸出換行符。
- tree.
- 失敗:未找到“tree.”。tree 是一個外部命令。
- dir..
- 列出父目錄的內容。
- cd..
- 將當前目錄更改為父目錄。
- cd\
- 將當前目錄更改為根目錄。
- start.
- 從當前目錄開啟 Windows 資源管理器。
- dir/b/s
- 遞迴地列出目錄內容,顯示完整路徑。
連結
萬用字元
[edit | edit source]許多命令接受檔名萬用字元,這些字元不代表它們本身,並能夠匹配一組檔名。
萬用字元
- *(星號):任何字元序列
- ?(問號):單個字元,除了句點(".")之外,或者如果它是檔名中最大無句點部分末尾一系列問號的一部分,則可能是零個字元;請參閱示例以瞭解說明
示例
- dir *.txt
- 匹配 Myfile.txt、Plan.txt 和任何其他副檔名為 .txt 的檔案。
- dir *txt
- 不需要包含句點。但是,這也會匹配沒有句點約定的檔名,例如 myfiletxt。
- ren *.cxx *.cpp
- 將所有副檔名為 .cxx 的檔案重新命名為副檔名為 .cpp 的檔案。
- dir a?b.txt
- 匹配檔案 aab.txt、abb.txt、a0b.txt 等。
- 不匹配 ab.txt,因為問號後面跟著除問號或句點以外的字元不能匹配零個字元。
- 不匹配 a.b.txt,因為問號不能匹配句點。
- dir ???.txt
- 匹配 .txt、a.txt、aa.txt 和 aaa.txt 等,因為序列中的每個問號後面跟著一個句點可以匹配任意數量的字元。
- dir a???.b???.txt???
- 匹配 a.b.txt 等。雖然最後一個問號序列後面沒有句點,但它仍然是檔名中最大無句點部分末尾的序列。
- dir ????????.txt & @REM 八個問號
- 匹配與 *.txt 相同的檔案,因為每個檔案在 .txt 之前也都有一個不超過 8 個字元的短檔名。
短檔名的怪癖:萬用字元匹配同時在長檔名和通常隱藏的 8 個字元 + 句點 + 3 個字元的短檔名上執行。這可能會導致意外情況。
與其他一些作業系統的 shell 不同,cmd.exe shell 不會自行執行萬用字元擴充套件(用匹配模式的檔名列表替換包含萬用字元的模式)。每個程式都有責任將萬用字元視為萬用字元。這使得諸如“ren *.txt *.bat”之類的操作成為可能,因為 ren 命令實際上看到了 * 萬用字元而不是匹配萬用字元的檔案列表。因此,“echo *.txt”不會顯示當前資料夾中匹配模式的檔案,而是直接輸出“*.txt”。另一個結果是,您可以編寫“findstr a.*txt”而不必擔心“a.*txt”部分被當前資料夾中一些檔案的名稱替換。此外,遞迴的“findstr /s pattern *.txt”是可能的,而在其他一些作業系統中,“*.txt”部分將被當前資料夾中找到的檔名替換,忽略巢狀資料夾。
接受萬用字元的命令包括 ATTRIB、COPY、DIR、FINDSTR、FOR、REN 等。
連結
使用者輸入
[edit | edit source]您可以使用以下方法從使用者獲取輸入
百分號波浪號
[edit | edit source]當 命令列引數 包含檔名時,可以使用特殊語法獲取有關檔案的各種資訊。
以下語法擴充套件到有關作為 %1 傳遞的檔案的各種資訊
| 語法 | 展開結果 | 示例 |
|---|---|---|
| %~1 | %1 不含引號 | 未提供 |
| %~f1 | 帶驅動器磁碟機代號的完整路徑 | C:\Windows\System32\notepad.exe |
| %~d1 | 驅動器磁碟機代號 | C |
| %~p1 | 無驅動器磁碟機代號的路徑,帶尾部反斜槓 | \Windows\System32\ |
| %~n1 | 對於檔案,則為不帶路徑和副檔名的檔名 對於資料夾,則為資料夾名稱 |
notepad |
| %~x1 | 包括句點的檔名副檔名 | .exe |
| %~s1 | 修改 f、n 和 x 以使用短名稱 | C:\PROGRA~2\WINDOW~3\ACCESS~1\wordpad.exe |
| %~a1 | 檔案屬性 | --a------ |
| %~t1 | 檔案上次修改的日期和時間(格式取決於 Windows 的“區域設定”) | 02.11.2006 11:45(例如,以“英語(美國)”格式) |
| %~z1 | 檔案大小 | 151040 |
| %~pn1 | p 和 n 的組合 | \Windows\System32\notepad |
| %~dpnx1 | 幾個字母的組合 | C:\Windows\System32\notepad.exe |
| %~$PATH:1 | PATH 變數中存在的資料夾中找到的第一個匹配項的完整路徑,或者在沒有匹配項的情況下為空字串。 | |
| %~n0 | 對 %0 應用 %~n 批處理的無副檔名名稱 |
tildetest |
| %~nx0 | 對 %0 應用 %~nx 批處理的名稱 |
tildetest.bat |
| %~d0 | 對 %0 應用 %~d 批處理的驅動器磁碟機代號 |
C |
| %~dp0 | 對 %0 應用 %~dp 批處理的資料夾,帶尾部反斜槓 |
C:\Users\Joe Hoe\ |
相同的語法適用於由 FOR 命令建立的單字母變數,例如“%%i”。
要從命令行了解有關此主題的資訊,請鍵入“call /?”或“for /?”。
連結
函式
[edit | edit source]函式,也稱為子程式,可以使用 CALL、標籤、SETLOCAL 和 ENDLOCAL 進行模擬。
確定算術冪的函式示例
@echo off
call :power 2 4
echo %result%
rem Prints 16, determined as 2 * 2 * 2 * 2
goto :eof
rem __Function power______________________
rem Arguments: %1 and %2
:power
setlocal
set counter=%2
set interim_product=%1
:power_loop
if %counter% gtr 1 (
set /a interim_product=interim_product * %1
set /a counter=counter - 1
goto :power_loop
)
endlocal & set result=%interim_product%
goto :eof
雖然函式末尾的 goto :eof 實際上並不需要,但在一般情況下,如果有不止一個函式,則必須存在。
可以在呼叫行上指定應將結果儲存在哪個變數中,如下所示
@echo off
call :sayhello result=world
echo %result%
exit /b
:sayhello
set %1=Hello %2
REM Set %1 to set the returning value
exit /b
在上面的示例中,exit /b 用於代替 goto :eof,它們的效果相同。
此外,請記住,等號是一種用於分隔引數的方法。因此,以下項實現相同的效果
- call :sayhello result=world
- call :sayhello result world
- call :sayhello result,world
- call :sayhello result;world
(請參閱 命令列引數 作為提醒)
連結
計算
[edit | edit source]批處理指令碼可以使用 SET /a 命令進行簡單的 32 位帶符號整數算術運算和按位操作。支援的最大整數為 2147483647 = 2 ^ 31 - 1。支援的最小整數為 -2147483648 = - (2 ^ 31),可以使用 set /a num=-2147483647-1 的技巧進行賦值。語法類似於 C 語言。
算術運算子包括 *、/、 %(取模)、+、-。在批處理中,取模必須輸入為“%%”。沒有求冪運算子。
按位運算子將數字解釋為 32 個二進位制位的序列。它們是 ~(補碼)、&(與)、|(或)、^(異或)、<<(左移)、>>(算術,也稱為符號保持右移)。沒有邏輯,也稱為符號清除右移,也沒有位旋轉運算子。
非運算子是 !: 它將零變為一,將非零變為零。
組合運算子是 ,: 它允許在一個 set 命令中進行更多計算。
組合賦值運算子以“+=”為模型,在“a+=b”中,它表示“a=a+b”。因此,“a-=b”表示“a=a-b”。類似地,*=、/=、 %=、&=、^=、|=、<<= 和 >>= 也是如此。
支援的運算子的優先順序順序如下
- ( )
- * / % + -
- << >>
- &
- ^
- |
- = *= /= %= += -= &= ^= |= <<= >>=
- ,
文字可以輸入為十進位制 (1234)、十六進位制 (0xffff,以 0x 開頭) 和八進位制 (0777,以 0 開頭)。
負整數的內部位表示形式為二進位制補碼。這為負整數提供按位操作、十六進位制文字(大於 0x7FFFFFFF 且小於或等於 0xFFFFFFFF)的賦值和算術結果,以及算術運算的溢位和下溢行為。例如,-2147483648 表示為 0x80000000,因此二進位制補碼運算“set /a num=~(-2147483647-1)”得到 2147483647,等於 0x7FFFFFFF(鍵入 set /a num=0x7FFFFFFF 檢查)。另一個例子,“-2 & 0xF”得到 14,因為 -2 是 0xFFFFFFFE,與 0xF 進行 AND 運算得到 0xE,即 14。雖然最大十進位制文字是 2147483647,但最大十六進位制文字是 0xFFFFFFFF,它被分配為十進位制 -1。類似地,0xFFFFFFFE 被分配為十進位制 -2,等等,因此,例如 0xFFFFFFFE - 2 得到 -4。大於 0xFFFFFFFF 的十六進位制文字將轉換為 -1,例如 0xFFFFFFFFFFFFFFFF,而大於 2147483647 的十進位制文字會產生錯誤。最小的可表示的 32 位帶符號整數是 -2147483648;“-2147483648”不能直接分配,因為這被解釋為 -1 * 2147483648,而 2147483648 大於最大十進位制文字 2147483647;但是,-2147483647-1 可以實現這一點,0x80000000 也可以。“-2147483647-2”下溢到最大的正整數 2147483647;類似地,“-2147483647-3”下溢到 2147483646。另一方面,“2147483647+1”溢位到 -2147483648,這對應於在內部位表示形式上執行加法,就好像它沒有符號一樣;“2147483647+2”溢位到 -2147483647,等等。
由於一些運算子對命令直譯器有特殊含義,因此使用它們的表示式需要用引號括起來,例如
- set /a num="255^127"
- set /a "num=255^127"
- 引號的替代放置。
- set /a num=255^^127
- 使用 ^ 而不是引號轉義 ^。
示例
- set /a n=(2+3)*5
- 執行簡單的計算並將結果儲存在環境變數 n 中。當互動式呼叫(在批處理之外)時,輸出計算結果,否則不輸出任何內容。
- set /a (2+3)*5
- 當互動式呼叫(在批處理之外)時,輸出計算結果,否則不輸出任何內容。不更改任何變數,僅對互動式使用有用。
- set n1=40 & set n2=25
set /a n3=%n1%+%n2%
- 使用標準百分號表示法進行變數擴充套件。
- set n1=40 & set n2=25
set /a n3=n1+n2
- 避免在變數名稱周圍使用百分號表示法,因為 /a 無需使用。
- set /a num="255^127"
- 將 "^" 括在引號中,以防止它在命令直譯器中具有特殊含義。
- set /a n1 = (10 + 5)/5
- 在 /a 中,= 周圍的空格無關緊要。但是,習慣它有利於在沒有 /a 的情況下編寫 "set var = value",這將設定 "var " 而不是 "var" 的值。
- if 1==1 (set /a n1=(2+4)*5)
- 不起作用:分組括號內的算術括號會導致問題。
- if 1==1 (set /a n1=^(2+4^)*5)
- 使用插入符號 (^) 轉義算術括號,或者將 "n1=2+(4*5)" 括在引號中,這兩種方法都有效。
- set /a n1=2+3,n2=4*7
- 執行兩個計算。
- set /a n1=n2=2
- 與 n1=2,n2=2 的效果相同。
- set n1=40 & set n2=25 & set /a n3=n1+n2
- 按預期工作。
- set /a n1=2,n2=3,n3=n1+n2
- 按預期工作。
- set n1=40 & set n2=25 & set /a n3=%n1%+%n2%
- 除非之前已設定 n1 和 n2,否則不起作用。變數規範 "%n1%" 和 "%n2"% 在第一個 set 命令執行 *之前* 被擴充套件。刪除百分比符號使其正常工作。
- set /a n1=2,n2=3,n3=%n1%+%n2%
- 除非之前已設定 n1 和 n2,否則不起作用,原因與上一個示例中所述相同。
- set /a n1=0xffff
- 使用十六進位制表示法設定 n1 為 "65535"。
- set /a n1=0777
- 使用八進位制表示法設定 n1 為 "511"。
- set /a n1=0xffffffff
- 將 n1 設定為 -1。
- set /a n1="~0"
- 將 n1 設定為 -1,符合負整數的底層二進位制補碼錶示。因此,非負整數的按位補碼 (~) 會產生負整數。
- set /a "n1=-1>>1"
- 輸出 -1,因為 ">>" 運算子是 *算術* 右移,保留了有符號 32 位整數底層位表示的最高位。請注意,-1 在內部是 0xFFFFFFFF。*邏輯* 右移(最高位丟棄)將導致 0x7FFFFFFF,即最大正 32 位整數。
- set /a "n1=(-1>>1) & 0x7FFFFFFF"
- 透過清除 32 位有符號整數底層位表示的最高位,模擬 *邏輯* 右移(最高位丟棄)1 位。
- set /a "n=-1, shiftcount=4, n1=(n>>shiftcount) & (0x7FFFFFFF >> (shiftcount-1))"
- 模擬 shiftcount > 0 的 *邏輯* 右移,當超過 1 位時需要清除多個最高位。
- set /a "n1=1<<32"
- 當右運算元為 32 或更高,或為負時,產生 0。這與現代 x86 處理器上左移指令的行為不同,該指令對 32 位暫存器右運算元進行掩碼以將其限制為 5 位。因此,使用 x86 指令,結果將為 1,因為 32 & 0x1F 為 0。在 C 語言中,結果未定義,實際結果與平臺相關。
- set /a n1=%random%
- 一個 0 到 32767 = 2^15-1 之間的偽隨機數。
- set /a n1=%random%>>10
- 一個 0 到 31 = 2^5-1 之間的偽隨機數。右移運算子丟棄了 15 位中的 10 位,保留了 5 位。
- set /a n1=%random%%50
- 一個 0 到 49 之間的偽隨機數。使用 % 模運算子。在批處理中, %% 用於模運算:set /a n1=%random%%%50。由於模運算子的這種特定用法,結果並非完全均勻;如果第二個模運算子運算元(上面的 50)等於 2 的冪,例如 256 = 2^8,則結果是均勻的。
- set /a n1="(%random%<<15)+%random%"
- 一個 0 到 1073741823 = 2^30 - 1 之間的偽隨機數。將 %random% 自身產生的兩個 15 位隨機數結合起來生成一個 30 位隨機數。
- set /a n1="((%random%<<15)+%random%)%1000000"
- 如上所述,但再次使用模運算子,這次是為了實現 0 到 999999 的範圍。
列印素數的示例計算
@echo off
setlocal
set n=1
:print_primes_loop
set /a n=n+1
set cand_divisor=1
:print_primes_loop2
set /a cand_divisor=cand_divisor+1
set /a cand_divisor_squared=cand_divisor*cand_divisor
if %cand_divisor_squared% gtr %n% echo Prime %n% & goto :print_primes_loop
set /a modulo=n%%cand_divisor
if %modulo% equ 0 goto :print_primes_loop & REM Not a prime
goto :print_primes_loop2
連結
- set at ss64.com
- set at Microsoft
- Random Numbers at ss64.com
- CMD.EXE 解析數字的規則 by dbenham, dostips.com
- 位運算 # 批處理檔案, rosettacode.org
查詢檔案
[edit | edit source]可以使用 #DIR、#FOR、#FINDSTR、#FORFILES 和 #WHERE 查詢檔案。
示例
- dir /b /s *base*.doc*
- 輸出當前資料夾及其子資料夾中的所有檔案,檔名字首包含單詞 "base",副檔名以 "doc" 開頭,包括 "doc" 和 "docx"。檔案以完整路徑輸出,每行一個檔案。
- dir /b /s *.txt | findstr /i pers.*doc
- 將輸出檔案(包括其完整路徑)的結果與 findstr 過濾命令(支援有限的正則表示式)結合起來,為根據檔名和目錄名查詢檔案提供了一種靈活且強大的組合。
- for /r %i in (*) do @if %~zi geq 1000000 echo %~zi %i
- 對於當前資料夾及其子資料夾中大小大於或等於 1,000,000 位元組的每個檔案,輸出檔案大小(以位元組為單位)和檔案的完整路徑。有關 %~zi 中的語法,請參見 #Percent tilde。
- forfiles /s /d 06/10/2015 /c "cmd /c echo @fdate @path"
- 對於當前資料夾及其子資料夾中在 2015 年 6 月 10 日或之後修改的每個檔案,輸出檔案修改日期和完整檔案路徑。/d 後面的日期格式是特定於區域設定的。因此,允許查詢最近修改的檔案。
- (for /r %i in (*) do @echo %~ti :: %i) | findstr 2015.*:
- 遞迴搜尋當前資料夾,輸出最後修改日期為 2015 年的檔案。在檔名之前放置修改日期和時間,後跟一個雙冒號。只要使用的 Windows 版本和區域設定以包含四位數年份的格式顯示日期,此方法就可以正常工作。雙冒號用於確保 findstr 命令匹配的是日期而不是檔名。
- for /r %i in (*) do @echo %~ti | findstr 2015 >NUL && echo %i
- 如上所述,輸出 2015 年更改的檔案。與上面不同,只輸出文件,不輸出修改日期。
- findstr /i /s /m cat.*mat *.txt
- 根據檔案內容查詢檔案。在以 .txt 結尾的檔案中執行對正則表示式 cat.*mat 的全文搜尋,並輸出檔名。/m 開關確保只輸出文件名。
- where *.bat
- 輸出當前目錄和 PATH 中目錄中的所有 .bat 檔案。
鍵盤快捷鍵
[edit | edit source]在從標準控制檯(在按下 Windows + R 後鍵入 cmd.exe 後出現)使用 Windows 命令列時,您可以使用多個鍵盤快捷鍵,包括功能鍵
- Tab: 從當前資料夾中的檔名或資料夾名中完成相關部分的已鍵入字串。相關部分通常是最後一個無空格部分,但使用引號會改變這一點。通常同時考慮檔案和資料夾進行完成,但 cd 命令只考慮資料夾。
- 上箭頭鍵和下箭頭鍵:一次輸入一個命令歷史記錄中的命令。
- Escape: 刪除當前正在鍵入的命令列。
- F1: 從命令歷史記錄中一次輸入一個字元,輸入之前輸入的單個命令中的字元。每次後續按下 F1 都會輸入一個字元。
- F2: 要求您輸入一個字元,並輸入命令歷史記錄中之前命令的最短字首,該字首不包含已鍵入的字元。因此,如果之前的命令是 echo Hello world,並且您鍵入了 o,則會輸入 ech。
- F3: 輸入命令歷史記錄中的單個之前命令。重複按下不會有任何其他效果。
- F4: 要求您輸入一個字元,並刪除當前鍵入的字串中從當前游標位置開始、向右繼續並以您輸入的字元(不包括該字元)結尾的部分。因此,如果您鍵入 echo Hello world,使用左箭頭鍵將游標置於 H,按下 F4,然後按下 w,您將得到 echo world。如果您按下 F4,然後按下 Enter,將刪除從游標到行尾的文字。
- F5: 一次輸入一個命令歷史記錄中的之前命令。
- F6: 輸入 Control+Z 字元。
- F7: 開啟一個帶命令歷史記錄的基於字元的彈出視窗,並允許您使用箭頭鍵和 Enter 選擇一個命令。在彈出視窗中按下 Enter 後,命令將立即執行。
- F8: 給定一個已鍵入的字串,一次顯示命令歷史記錄中以該字串為字首的專案。
- F9: 允許您輸入命令歷史記錄中命令的編號,然後執行該命令。
- Alt + F7: 刪除命令歷史記錄。
以上也被稱為命令提示符鍵盤快捷鍵。
以上快捷鍵的可用性似乎不依賴於執行 DOSKEY。
連結
路徑
[edit | edit source]檔案和目錄路徑遵循某些約定。這些約定包括可能使用磁碟機代號後跟冒號 (:),使用反斜槓 (\) 作為路徑分隔符,以及相對路徑和絕對路徑之間的區別。
正斜槓 (/) 在用作 (\) 的替代品時通常有效,但並非總是有效;它通常用於標記開關(選項)。使用正斜槓會導致各種模糊的行為,最好避免使用。
特殊裝置名稱包括 NUL、CON、PRN、AUX、COM1、...、COM9、LPT1、...、LPT9;這些可以重定向到。
示例
- attrib C:\Windows\System32\notepad.exe
- 如果檔案存在,則會成功,因為它應該存在。這是一個包含磁碟機代號的 *絕對* 路徑。它也被稱為 *完全限定* 路徑。
- attrib \Windows\System32\notepad.exe
- 如果當前驅動器為 C:,並且檔案存在,則會成功,因為它應該存在。這是一個沒有磁碟機代號的絕對路徑。
- cd /d C:\Windows & attrib System32\notepad.exe
- 如果檔案存在,則會成功。傳遞給 attrib 的路徑是 *相對* 路徑。
- cd /d C:\Windows\System32 & attrib C:notepad.exe
- 如果檔案存在,則成功。傳遞給 attrib 的路徑是相對路徑,儘管包含驅動器磁碟機代號:必須存在 C:\notepad.exe,並且包含反斜槓才能使其成為絕對路徑。
- cd /d C:\Windows & attrib .\System32\notepad.exe
- 如果檔案存在,則成功。單個句點表示當前資料夾。
- attrib .
- 單個句點表示當前資料夾。
- cd /d C:\Windows & attrib .\System32\\\notepad.exe
- 如果檔案存在,則成功。反斜槓的堆疊除了第一個反斜槓外沒有其他影響。
- cd /d C:\Windows & attrib .\System32
- 如果資料夾存在,則成功。
- cd /d C:\Windows & attrib .\System32\
- 失敗。通常情況下,資料夾不用最後的反斜槓表示。
- cd C:\Windows\System32\
- 成功,無論如何。
- cd ..
- 雙句點表示父資料夾。
- attrib C:\Windows\System32\..\..\Windows\System32
- 雙句點可以用於路徑中間,用於導航到父資料夾,甚至可以多次使用。
- attrib \\myserver\myvolume
- 網路 UNC 路徑以雙反斜槓開頭,沒有驅動器磁碟機代號。
- cd \\myserver\myvolume
- 不工作;以這種直接的方式更改到伺服器資料夾不起作用。
- pushd \\myserver\folder
- 自動為資料夾建立驅動器並更改到該驅動器。使用 #POPD 後,驅動器將再次取消分配。
- attrib C:/Windows/System32/notepad.exe
- 在多個版本的 cmd.exe 上成功。使用正斜槓。
連結
- 長檔名、NTFS 和 ss64.com 上的合法檔名字元
- Microsoft 的命名檔案、路徑和名稱空間
- W:Path (computing)#MS-DOS/Microsoft Windows style, wikipedia.org
- 為什麼 Windows 上的 cmd.exe shell 使用正斜槓 ('/) 路徑分隔符的路徑會失敗?, stackoverflow.com
陣列
[edit | edit source]在延遲擴充套件模式下,可以使用 % 和 ! 的組合來模擬陣列,以指示變數。其中,%i% 是變數 i 的值,使用立即擴充套件,而 !i! 是變數 i 的值,使用延遲擴充套件。
@echo off
setlocal EnableDelayedExpansion
for /l %%i in (1, 1, 10) do (
set array_%%i=!random!
)
for /l %%i in (1, 1, 10) do (
echo !array_%%i!
)
:: For each item in the array, not knowing the length
set i=1
:startloop
if not defined array_%i% goto endloop
set array_%i%=!array_%i%!_dummy_suffix
echo A%i%: !array_%i%!
set /a i+=1
goto startloop
:endloop
連結
- cmd.exe (批處理) 指令碼中的陣列、連結串列和其他資料結構, stackoverflow.com
Perl 單行命令
[edit | edit source]一些任務可以使用 Perl 單行命令方便地實現。Perl 是一種指令碼語言,起源於另一個作業系統的環境。由於許多 Windows 計算環境都安裝了 Perl,因此 Perl 單行命令是 Windows 批處理指令碼的自然且緊湊的擴充套件。
示例
- echo "abcbbc"| perl -pe "s/a.*?c/ac/"
- 讓 Perl 充當 sed,該工具支援使用正則表示式指定的文字替換。
- echo a b| perl -lane "print $F[1]"
- 讓 Perl 充當 cut 命令,顯示該行的第 2 個欄位或列,在本例中為 b。使用 $F[2] 顯示第 3 個欄位;索引從零開始。原生解決方案:FOR /f。
- perl -ne "print if /\x22hello\x22/" file.txt
- perl -ne "$. <= 10 and print" MyFile.txt
- 讓 Perl 充當 head -10 命令,輸出檔案的前 10 行。
- perl -e "sleep 5"
- 等待 5 秒。
- for /f %i in ('perl -MPOSIX -le "print strftime '%Y-%m-%d', localtime"'') do @set isodate=%i
- 將當前日期以 ISO 格式獲取到 isodate 變數中。
- perl -MWin32::Clipboard -e "print Win32::Clipboard->Get()"
- 輸出剪貼簿的文字內容。儲存到 getclip.bat 後,會產生一個方便的 getclip 命令來補充 CLIP 命令。
- perl -MText::Diff -e "print diff 'File1.txt', 'File2.txt'"
- 以類似於其他作業系統中 diff 命令的格式輸出兩個檔案之間的差異,包括上下文行、以 + 開頭的行和以 - 開頭的行。
- perl -MWin32::Sound -e "Win32::Sound::Play('C:\WINDOWS\Media\notify.wav');"
- 播放 notify.wav 中的通知聲音,不顯示任何視窗。
在網路上,Perl 單行命令通常以另一個作業系統的命令列約定釋出,包括使用撇號 (') 而不是 Windows 引號來包圍引數。這些需要針對 Windows 進行調整。
連結
- novosial.org 上的 Perl 單行命令
- 為什麼我的 Perl 單行命令在 Windows 上不起作用?在 stackoverflow.com 上
- W:One-liner program#Perl
Unix 命令
[edit | edit source]Windows cmd.exe 命令直譯器可以使用類 Unix 作業系統的命令,前提是這些命令已安裝。示例命令包括 grep、sed、awk、wc、head 和 tail。這些命令來自 GNU 專案,並且存在其 Windows 移植版本。您可以在 Unix 指南 Wikibook 中瞭解更多關於這些命令的資訊。請注意,依賴這些命令的批處理程式不能保證在其他 Windows 機器上執行。
可以從以下專案獲取免費許可的 Windows 版本的 GNU 命令
- GnuWin32, sourceforge.net
- ezwinports, sourceforge.net:具有一些比 GnuWin32 更新的移植版本
為 Windows 10 執行 GNU 命令的另一種方法是 Windows Subsystem for Linux。
更改檔案時間戳
[edit | edit source]沒有其他作業系統中熟悉的 touch 命令。touch 命令將修改檔案的最後修改時間戳,而不會改變其內容。
一個解決方法是,其可靠性和跨各種 Windows 版本的適用性尚不清楚,如下所示
- copy /b file.txt+,,
連結
- Windows 遞迴 touch 命令 在 superuser.com 上
- Windows 版本的 Unix touch 命令 在 stackoverflow.com 上
獲取最後幾行
[edit | edit source]沒有內建命令來獲取檔案的最後幾行;沒有 tail 命令的等效項。但是,可以編寫一個批處理程式來完成這項工作,並且可以在下面的連結中找到。或者,可以為 Windows 安裝 tail 命令,或者執行不需要安裝的 PowerShell 等效命令。
連結
- CMD.EXE 批處理指令碼以顯示 txt 檔案中的最後 10 行, stackoverflow.com
十六進位制轉儲
[edit | edit source]沒有預安裝的十六進位制轉儲工具來以十六進位制檢視檔案內容。儘管如此,還是有以下幾種選擇
1) 使用fsutil file createnew 建立一個全零位元組檔案,並使用fc 透過比較檢視位元組
- fsutil file createnew allzeros.bin 1000
fc /b C:\Windows\notepad.exe allzeros.bin- 在比較中沒有顯示 notepad.exe 中為零的位元組,但其他位元組及其偏移量(每行一個位元組)將顯示出來。您可以透過更改上面的最後一個 1000 來選擇全零位元組檔案的長度,從而確定要檢視多少個初始位元組。要檢視完整檔案,請建立與要檢查的檔案長度相同長度的全零位元組檔案。這遠非完美,但可以用作一個快速方法來檢視例如 BOM 標記或使用的換行符型別。
2) 使用 certutil -encodeHex,其中 encodeHex 功能沒有官方文件
- certutil -encodeHex file.txt filehex.txt
- 將 file.txt 的檔案內容以十六進位制寫入 filehex.txt。如果 filehex.txt 存在,則拒絕覆蓋它。您無法限制要轉換的位元組數。
3) 使用 PowerShell 5.0 Format-Hex
- powershell Format-Hex C:\Windows\notepad.exe
- 最新 PowerShell 支援選項 -Count。
4) 安裝諸如功能豐富的od 或hexdump 之類的命令;請參見 Unix 命令。od 也可以進行八進位制轉儲。
5) 如果您使用的是舊的 32 位版 Windows(不太可能),請使用debug;請參見 DEBUG.
連結
- fc, docs.microsoft.com
- certutil, ss64.com
- certutil, docs.microsoft.com
- Format-Hex, docs.microsoft.com
- 使用 CERTUTIL 的 HEXDUMP.BAT 版本 2.1,作者 Dave Benham,dostips.com
- :hexDump 新功能 - 由 Dave Benham,dostips.com - 純批處理;大量批處理魔法,而且很慢
如果您的使用者具有提升的管理許可權,您可以在以特定方式啟動 cmd.exe 時使用這些許可權。要以提升的許可權啟動 cmd.exe,您可以執行以下操作。
- 選擇“開始”選單,並在其中鍵入“cmd.exe”。
- 右鍵單擊 cmd.exe 圖示,然後選擇“以管理員身份執行”。
要測試您是否擁有提升的許可權
- 執行“net session”,如果您沒有許可權,它將失敗。
限制包括以下內容
- 沒有 while 迴圈;可以透過標籤和 goto 模擬。有一個 for 迴圈和一個 if 語句。
- 沒有迴圈控制 break 和 continue 語句,這些語句來自 C 語言。
- 沒有合適的自定義函式;可以使用標籤、呼叫和 %n 引數擴充套件建立自定義函式。
- 對包含特殊字元(如引號 (") 或與號 (&))的字串進行脆弱的處理。
- 沒有陣列;可以以有限的方式模擬。
- 沒有關聯陣列,也稱為字典。
- 沒有浮點運算。
- 沒有來自 C 語言的三元條件運算子。
- 沒有將字元轉換為其 ASCII 值或將 ASCII 值轉換為字元的函式。沒有合理的變通方法。
- 沒有任意大的整數運算。
- 沒有 touch 命令可以更改來自其他作業系統的檔案時間戳;沒有 head 和 tail 命令。
- 沒有 GUI 程式設計。
- 還有更多。
這些命令都內建在命令直譯器本身中,無法更改。有時這是因為它們需要訪問內部命令直譯器資料結構,或修改命令直譯器程序本身的屬性。
| 命令 | 描述 |
|---|---|
| ASSOC | 將副檔名與檔案型別 (FTYPE) 關聯。 |
| BREAK | 設定或清除擴充套件的 CTRL+C 檢查。 |
| CALL | 從另一個批處理程式中呼叫一個批處理程式。 |
| CD,CHDIR | 輸出或設定當前目錄。 |
| CHCP | 輸出或設定活動內碼表號。 |
| CLS | 清除螢幕。 |
| COLOR | 設定控制檯的前景色和背景色。 |
| COPY | 複製檔案。 |
| DATE | 輸出並設定系統日期。 |
| DEL,ERASE | 刪除一個或多個檔案。 |
| DIR | 輸出目錄中檔案和子目錄的列表。 |
| ECHO | 輸出訊息,或開啟或關閉命令回顯。 |
| ELSE | 當 "IF" 不為真時,在批處理程式中執行條件處理。 |
| ENDLOCAL | 結束批處理檔案中環境更改的本地化。 |
| EXIT | 退出 CMD.EXE 程式(命令直譯器)。 |
| FOR | 對一組檔案中的每個檔案執行指定的命令。 |
| FTYPE | 設定檔案型別命令。 |
| GOTO | 跳轉到標籤。 |
| IF | 在批處理程式中執行條件處理。 |
| MD,MKDIR | 建立目錄。 |
| MOVE | 將檔案移動到新位置 |
| PATH | 設定或修改 PATH 環境 |
| PAUSE | 使命令會話暫停以等待使用者輸入。 |
| POPD | 更改為從目錄堆疊中彈出的驅動器和目錄 |
| PROMPT | 設定或修改等待輸入時顯示的字串。 |
| PUSHD | 將當前目錄壓入堆疊,並更改為新目錄。 |
| RD / RMDIR | 刪除目錄。 |
| REM | 註釋命令。與雙冒號 (::) 不同,可以執行該命令。 |
| REN / RENAME | 重新命名檔案或目錄。 |
| SET | 設定或輸出 shell 環境變數。 |
| SETLOCAL | 為批處理檔案建立子環境。 |
| SHIFT | 將批處理引數向前移動。 |
| START | 使用各種選項啟動程式。 |
| TIME | 輸出或設定系統時鐘。 |
| TITLE | 更改視窗標題 |
| TYPE | 將檔案的內容列印到控制檯。 |
| VER | 顯示命令處理器、作業系統版本。 |
| VERIFY | 驗證檔案複製是否已正確完成。 |
| VOL | 顯示當前卷的標籤。 |
將副檔名與檔案型別 (FTYPE) 關聯,輸出現有關聯,或刪除關聯。另請參見 FTYPE。
示例
- assoc
- 列出所有關聯,格式為“<副檔名>=<檔案型別>”,例如“.pl=Perl”或“.xls=Excel.Sheet.8”。
- assoc | find ".doc"
- 列出所有包含“.doc”子字串的關聯。
連結
在基於 Windows NT 的 Windows 版本中,不執行任何操作;出於與 MS DOS 的相容性而保留。
示例
- break > empty.txt
- 建立空檔案或清除現有檔案的內容,利用 break 不執行任何操作且沒有輸出這一事實。比 "type nul > empty.txt" 更短。
連結
從另一個批處理程式中呼叫一個批處理程式,在一個批處理程式中呼叫一個子程式,或者,作為一項未公開的行為,啟動一個程式。特別地,暫停呼叫者的執行,開始執行被呼叫者,並在被呼叫者完成執行時,如果需要,恢復呼叫者的執行。
有關呼叫子程式的資訊,請參見 函式 部分。
請注意,在不使用 call 關鍵字的情況下,從批處理中呼叫批處理會導致執行永遠不會返回到呼叫者,因為被呼叫者已完成。
被呼叫者繼承呼叫者的環境變數,並且除非被呼叫者透過 SETLOCAL 阻止這種情況,否則被呼叫者對環境變數所做的更改將在呼叫者恢復執行後對呼叫者可見。
示例
- mybatch.bat
- 如果在批處理中使用,則將控制權轉移到 mybatch.bat,並且永遠不會恢復呼叫者的執行。
- call mybatch.bat
- call mybatch
- call mybatch.bat arg1 "arg 2"
- call :mylabel
- call :mylabel arg1 "arg 2"
- cmd /c mybatch.bat
- 類似於 call,但即使出現錯誤也會恢復執行。此外,被呼叫者對環境變數所做的任何更改都不會傳播到呼叫者。
- call notepad.exe
- 啟動記事本,或者一般而言,啟動任何其他可執行檔案。這顯然不是 call 的預期用法,並且沒有正式記錄。
連結
- ss64.com 上的 call
- Microsoft 上的 call
- CALL 命令與 START 以及 /WAIT 選項,stackoverflow.com
更改為不同的目錄,或輸出當前目錄。但是,如果使用了不同的驅動器號,則不會切換到該不同的驅動器或卷。
示例
- cd
- 輸出當前目錄,例如 C:\Windows\System32。
- cd C:\Program Files
- 路徑中有空格時,不需要周圍的引號。
- cd \Program Files
- cd Documents
- cd %USERPROFILE%
- cd /d C:\Program Files
- 更改為 C: 驅動器的目錄,即使 C: 不是當前驅動器。
- C: & cd C:\Program Files.
- 更改為 C: 驅動器的目錄,即使 C: 不是當前驅動器。
- cd ..
- 更改為上級目錄。如果已經在根目錄中,則不執行任何操作。
- cd ..\..
- 更改為向上兩級的上級目錄。
- C: & cd C:\Windows\System32 & cd ..\..\Program Files
- 使用 ".." 在目錄樹中上下導航
- cd \\myserver\folder
- 不起作用。無法直接將目錄更改為網路通用命名約定 (UNC) 資料夾。關鍵詞:UNC 路徑。
- subst A: \\myserver\folder && cd /d A
- 使用 #SUBST 命令將目錄更改為伺服器資料夾,假設驅動器號 A: 可用。
- pushd \\myserver\folder
- 自動為資料夾建立驅動器並更改到該驅動器。使用 #POPD 後,驅動器將再次取消分配。
- cd C:\W*
- 更改為 C:\Windows,在典型的 Windows 設定中。因此,萬用字元有效。這對於從命令列手動鍵入很有用。
- cd C:\W*\*32
- 更改為 C:\Windows\System32,在典型的 Windows 設定中。
連結
CD 的同義詞。
清除螢幕。
設定控制檯的前景色和背景色。
示例
- color f9
- 使用白色背景和藍色前景色。
- color
- 恢復原始顏色設定。
連結
複製檔案。另請參見MOVE、XCOPY 和ROBOCOPY。
示例
- copy F:\File.txt
- 將檔案複製到當前目錄,假設當前目錄不是 F:\。
- copy "F:\My File.txt"
- 與上面相同;需要使用引號將包含空格的檔案包圍。
- copy F:\*.txt
- 將位於 F:\ 並以 .txt 結尾的檔案複製到當前目錄,假設當前目錄不是 F:\。
- copy F:\*.txt .
- 與上面的命令相同。
- copy File.txt
- 顯示錯誤訊息,因為無法將 File.txt 複製到自身。
- copy File1.txt File2.txt
- 將 File1.txt 複製到 File2.txt,如果使用者確認或從批處理指令碼執行,則覆蓋 File2.txt。
- copy File.txt "My Directory"
- 將 File.txt 複製到 "My Directory" 目錄,假設 "My Directory" 存在。
- copy Dir1 Dir2
- 將直接位於目錄 Dir1 中的所有檔案複製到 Dir2,假設 Dir1 和 Dir2 是目錄。不會複製位於 Dir1 的巢狀目錄中的檔案。
- copy *.txt *.bak
- 對於當前資料夾中的每個 *.txt 檔案,建立一個以 "bak" 結尾而不是 "txt" 結尾的副本。
連結
刪除檔案。謹慎使用,尤其是在與萬用字元結合使用時。僅刪除檔案,不刪除目錄,請參見RD。有關更多資訊,請鍵入 "del /?"。
示例
- del File.txt
- del /s *.txt
- 遞迴刪除檔案,包括巢狀目錄,但保留目錄;不加詢問地刪除所有匹配的檔案。
- del /p /s *.txt
- 與上面相同,但在刪除每個檔案之前都會詢問確認。
- del /q *.txt
- 不詢問確認就刪除。
連結
列出目錄的內容。提供各種選項。鍵入 "dir /?" 以獲取更多幫助。
示例
- dir
- 列出當前資料夾中的檔案和資料夾,不包括隱藏檔案和系統檔案;如果 DIRCMD 變數不為空且包含 dir 的開關,則使用不同的列出方式。
- dir D
- dir /b C:\Users
- dir /s
- 遞迴列出目錄及其所有子目錄的內容。
- dir /s /b
- 遞迴列出目錄及其所有子目錄的內容,每行一個檔案,顯示每個列出檔案或目錄的完整路徑。
- dir *.txt
- 列出所有副檔名為 .txt 的檔案。
- dir /a
- 在列表中包含隱藏檔案和系統檔案。
- dir /ah
- 僅列出隱藏檔案。
- dir /ad
- 僅列出目錄。/A 後的其他字母包括 S、I、R、A 和 L。
- dir /ahd
- 僅列出隱藏目錄。
- dir /a-d
- 僅列出檔案,不包括目錄。
- dir /a-d-h
- 僅列出非隱藏檔案,不包括目錄。
- dir /od
- 按上次修改日期對檔案和資料夾進行排序。/O 後的其他字母包括 N(按名稱)、E(按副檔名)、S(按大小)和 G(資料夾優先)
- dir /o-s
- 按大小降序對檔案進行排序;對資料夾排序的影響尚不清楚。
- dir /-c /o-s /a-d
- 按大小降序列出檔案,透過 /-C 省略千位分隔符,不包括資料夾。
- dir /s /b /od
- 遞迴列出目錄及其所有子目錄的內容,按每個目錄的上次修改日期對檔案進行排序。排序僅在每個目錄中進行;不會對找到的所有檔案的完整集合進行排序。
- dir /a /s
- 遞迴列出檔案,包括隱藏檔案和系統檔案。透過考慮輸出的最後幾行,可用於找出磁碟使用情況(目錄大小)。
連結
輸出或設定日期。日期的輸出方式取決於國家/地區設定。也可以使用 "echo %DATE%" 輸出日期。
以 ISO 格式獲取日期,如 "2000-01-28":這並不容易,因為日期格式取決於國家/地區設定。
- 如果您假設格式為 "Mon 01/28/2000",則以下操作將起作用
- set isodate=%date:~10,4%-%date:~4,2%-%date:~7,2%
- 如果您有WMIC,則以下操作與區域設定無關
- for /f %i in ('wmic os get LocalDateTime') do @if %i lss a if %i gtr 0 set localdt=%i
set isodate=%localdt:~0,4%-%localdt:~4,2%-%localdt:~6,2% - 要在批處理中使用上述程式碼,請將 %i 更改為 %%i 並從 if 之前的 @ 中刪除。
- for /f %i in ('wmic os get LocalDateTime') do @if %i lss a if %i gtr 0 set localdt=%i
- 如果您安裝了 Perl
- for /f %i in ('perl -MPOSIX -le "print strftime '%Y-%m-%d', localtime"'') do @set isodate=%i
連結
- date at ss64.com
- date at Microsoft
- 如何在 Windows 命令列中獲取當前日期時間,以適合在檔名中使用? at stackoverflow
輸出訊息,或開啟或關閉命令回顯。
示例
- echo on
- @echo off
- echo Hello
- echo "hello"
- 也輸出引號。
- echo %PATH%
- 輸出 PATH 變數的內容。
- echo Owner ^& son
- 使用脫字元 (^) 轉義與符號 (&),從而能夠回顯與符號。
- echo 1&echo 2&echo 3
- 輸出三個字串,每個字串後跟一個換行符。
- echo.
- 輸出一個換行符,而句點沒有被輸出。如果沒有句點,則輸出 "echo off" 或 "echo on"。在句點前新增空格會導致句點被輸出。其他具有與句點相同效果的字元包括 :;,/\(=+[].
- echo %random%>>MyRandomNumbers.txt
- 雖然它看起來像是在向 MyRandomNumbers.txt 輸出隨機數,但實際上它不會為 0-9 的數字這樣做,因為這些數字放在 >> 前面時表示要重定向的通道。另請參見#重定向。
- echo 2>>MyRandomNumbers.txt
- 將標準錯誤重定向到檔案,而不是回顯 2。
- (echo 2)>>MyRandomNumbers.txt
- 即使是較小的數字(在本例中為 2)也回顯並重定向結果。
- >>MyRandomNumbers.txt echo 2
- 另一種回顯即使是較小的數字並重定向結果的方式。
顯示不帶換行符的字串需要使用技巧
- set <NUL /p=Output of a command
- 輸出 "Output of a command:"。下一條命令的輸出將立即顯示在 ":" 後面。
- set <NUL /p=Current time: & time /t
- 輸出 "Current time: " 後跟 "time /t" 的輸出。
- (set <NUL /p=Current time: & time /t) >tmp.txt
- 與之前相同,將兩條命令的輸出重定向到檔案。
連結
一個例子
if exist file.txt (
echo The file exists.
) else (
echo The file does not exist.
)
另請參見IF。
結束使用SETLOCAL 開始的本地環境變數集。可用於建立子程式:請參見函式。
連結
DEL 的同義詞。
退出 DOS 控制檯,或者使用 /b 僅退出當前正在執行的批處理或當前正在執行的子例程。如果在批處理檔案中不使用 /b,則會導致呼叫批處理的 DOS 控制檯關閉。
示例
- exit
- exit /b
連結
迭代一系列值,執行命令。關鍵字:迴圈。
在以下示例中,%i 用於命令列,而 %%i 用於批處理。索引(例如 %i)必須是一個單字元變數名。
不帶開關和帶 /r 和 /d 開關的示例
- for %%i in (1,2,3) do echo %%i
- 在批處理中,回顯 1、2 和 3。在批處理中,命令必須使用雙百分號。
- 其餘示例旨在直接貼上到命令列中,因此它們使用單百分號幷包含 "@" 以防止重複顯示。
- for %i in (1,2,3) do @echo %i
- 從命令列回顯 1、2 和 3。
- for 命令嘗試將專案解釋為檔名以及包含萬用字元的檔名模式。
- 即使專案不匹配現有檔名,它也不會報錯。
- for %i in (1,2,a*d*c*e*t) do @echo %i
- 除非您碰巧有一個匹配第三個模式的檔案,否則回顯 1 和 2,放棄第三個專案。
- for %i in (1 2,3;4) do @echo %i
- 回顯 1、2、3 和 4。是的,使用的是專案分隔符的混合。
- for %i in (*.txt) do @echo %i
- 回顯位於當前資料夾中且副檔名為 .txt 的檔案的檔名。
- for %i in ("C:\Windows\system32\*.exe") do @echo %i
- 回顯匹配該模式的檔名。
- for /r %i in (*.txt) do @echo %i
- 回顯當前資料夾(包括子資料夾)中所有副檔名為 .txt 的檔案的完整路徑和檔名。
- for /d %i in (*) do @echo %i
- 回顯當前資料夾中所有資料夾的名稱。
- for /r /d %i in (*) do @echo %i
- 回顯當前資料夾(包括子資料夾)中所有資料夾的完整路徑和名稱。
- for /r %i in (*) do @if %~zi geq 1000000 echo %~zi %i
- 對於當前資料夾及其子資料夾中大小大於或等於 1,000,000 位元組的每個檔案,輸出檔案大小(以位元組為單位)和檔案的完整路徑。有關 %~zi 中的語法,請參見 #Percent tilde。
/l 開關示例
- for /l %i in (1,2,11) do @echo %i
- 回顯從 1 到 11 的數字,步長為 2。格式為 (起始值,步長,結束值)。支援 32 位有符號整數。
- for /l %i in (10,-1,1) do @echo %i
- 回顯從 10 到 1 的數字,遞減。
- for /l %i in (1,0,1) do @echo %i
- 持續回顯 1;無限迴圈。
- for /l %i in (0) do @echo %i
- 持續回顯 0;無限迴圈。
- for /l %i in () do @echo %i
- 持續回顯 0;無限迴圈。
- for /l %i in (-10,1) do @echo %i
- 回顯從 -10 到 0 的數字;未明確指定的結束值預設為零。
- for /l %i in (0xF, 1, 020) do @echo %i
- 回顯從 15 到 16 的數字;因此,支援十六進位制和八進位制字面量。
- for /l %i in (2147483646,1,2147483647) do @echo %i
- 回顯 2147483646,然後是 2147483647,然後是 -2147483648,然後是 -2147483647,等等。這可能是由於 2147483647 的增量溢位到 -2147483648 造成的。
- for /l %i in (-2147483648,1,-2147483647) do @echo %i
- 回顯 -2147483648 和 -2147483647。因此,直接支援 -2147483648 字面量,與 set /a 不同。
/f 開關示例
- for /f "tokens=*" %i in (list.txt) do @echo %i
- 對檔案中的每一行,回顯該行。
- for /f "tokens=*" %i in (list1.txt list2.txt) do @echo %i
- 對檔案中的每一行,回顯該行。
- for /f "tokens=*" %i in (*.txt) do @echo %i
- 不執行任何操作。不接受匹配檔名的萬用字元。
- for /f "tokens=1-3 delims=:" %a in ("First:Second::Third") do @echo %c-%b-%a
- 將字串解析成以 “:” 為分隔符的標記。
- 引號表示字串不是檔名。
- 即使在 "do" 之前的命令部分沒有明確提及 %b 和 %c,但第二個和第三個標記儲存在 %b 和 %c 中。
- 兩個連續的冒號被視為一個分隔符;%c 不是 "",而是 "Third"。
- 執行其他作業系統中 cut 命令的部分功能。
- for /f "tokens=1-3* delims=:" %a in ("First:Second::Third:Fourth:Fifth") do @echo %c-%b-%a: %d
- 與上面相同,只是第四個和第五個專案被捕獲到 %d 中,作為 "Fourth:Fifth",包括分隔符。
- for /f "tokens=1-3* delims=:," %a in ("First,Second,:Third:Fourth:Fifth") do @echo %c-%b-%a: %d
- 可以有多個分隔符。
- for /f "tokens=1-3" %a in ("First Second Third,item") do @echo %c-%b-%a
- 預設分隔符是空格和製表符。因此,它們與傳遞給批處理的以分隔符分隔的引數不同。
- for /f "tokens=*" %i in ('cd') do @echo %i
- 對命令結果的每一行,回顯該行。
- for /f "tokens=*" %i in ('dir /b /a-d-h') do @echo %~nxai
- 對當前資料夾中的每個非隱藏檔案,輸出檔案屬性,後跟檔名。在字串 "%~nxai" 中,使用 #Percent tilde 中描述的語法。
- for /f "usebackq tokens=*" %i in (`dir /b /a-d-h`) do @echo %~nxai
- 與上面相同,但使用反引號 (`) 將要執行的命令括起來。
- for /f "tokens=*" %i in ('tasklist ^| sort ^& echo End') do @echo %i
- 要執行的命令中的管道和與運算子必須使用插入符號 (^) 轉義。
重定向示例
- (for %i in (1,2,3) do @echo %i) > anyoldtemp.txt
- 要重定向整個 for 迴圈的結果,請將整個迴圈放在方括號內,然後重定向。否則,重定向將繫結到迴圈主體,因此迴圈主體的每次新迭代都會覆蓋之前迭代的結果。
- for %i in (1,2,3) do @echo %i > anyoldtemp.txt
- 與上面相關的示例。它顯示了未將迴圈放在方括號內的後果。
繼續: 要跳轉到迴圈的下一輪迭代,從而模擬許多語言中已知的 continue 語句,可以使用 goto,前提是將迴圈主體放在子例程中,如下所示
for %%i in (a b c) do call :for_body %%i
exit /b
:for_body
echo 1 %1
goto :cont
echo 2 %1
:cont
exit /b
如果您直接在 for 迴圈中使用 goto,goto 的使用將破壞迴圈簿記。以下操作失敗
for %%i in (a b c) do (
echo 1 %%i
goto :cont
echo 2 %%i
:cont
echo 3 %%i
)
連結
- for at ss64.com
- Microsoft 上的 for
- CMD.EXE 解析數字的規則 by dbenham, dostips.com
FTYPE
[edit | edit source]輸出或設定要為檔案型別執行的命令。另請參閱 ASSOC。
示例
- ftype
- 列出所有與檔案型別關聯的要執行的命令,例如,'Perl="C:\Perl\bin\perl.exe" "%1" %*'
- ftype | find "Excel.Sheet"
- 僅列出顯示行中包含 "Excel.Sheet" 的關聯。
連結
GOTO
[edit | edit source]跳轉到標籤。
一個例子
goto :mylabel
echo Hello 1
REM Hello 1 never gets printed.
:mylabel
echo Hello 2
goto :eof
echo Hello 3
REM Hello 3 never gets printed. Eof is a virtual label standing for the end of file.
在 for 迴圈的主體內使用 goto 會使 cmd 忘記迴圈,即使標籤在同一個迴圈主體中也是如此。
連結
IF
[edit | edit source]有條件地執行命令。在 CMD 提示符下輸入 IF /? 可檢視文件。
可用的基本測試
- exist <filename>
- <string>==<string>
- <expression1> equ <expression2> -- 等於
- <expression1> neq <expression2> -- 不等於
- <expression1> lss <expression2> -- 小於
- <expression1> leq <expression2> -- 小於或等於
- <expression1> gtr <expression2> -- 大於
- <expression1> geq <expression2> -- 大於或等於
- defined <variable>
- errorlevel <number>
- cmdextversion <number>
可以對每個基本測試應用 "not"。顯然,沒有像 AND、OR 等運算子來組合基本測試。
/I 開關使 == 和 equ 比較忽略大小寫。
一個例子
if not exist %targetpath% (
echo Target path not found.
exit /b
)
示例
- if not 1 equ 0 echo Not equal
- if 1 equ 0 echo A & echo B
- 不執行任何操作;兩個 echo 命令都受條件約束。
- if not 1 equ 0 goto :mylabel
- if not a geq b echo Not greater
- if b geq a echo Greater
- if b geq A echo Greater in a case-insensitive comparison
- if B geq a echo Greater in a case-insensitive comparison
- if 0 equ 00 echo Numerical equality
- if not 0==00 echo String inequality
- if 01 geq 1 echo Numerical comparison
- if not "01" geq "1" echo String comparison
- if 1 equ 0 (echo Equal) else echo Unequal
- 請注意,正 then 部分周圍的方括號使其生效。
- if not a==A echo Case-sensitive inequality
- if /i a==A echo Case-insensitive equality
- if /i==/i echo This does not work
- if "/i"=="/i" echo Equal, using quotation marks to prevent the literal meaning of /i
連結
MD
[edit | edit source]建立新目錄或目錄。有一個同義詞 MKDIR;另請參閱其反義詞 RD。
示例
- md Dir
- 在當前目錄中建立一個目錄。
- md Dir1 Dir2
- 在當前目錄中建立兩個目錄。
- md "My Dir With Spaces"
- 在當前目錄中建立名稱包含空格的目錄。
連結
MKDIR
[edit | edit source]MD 的同義詞。
MKLINK
[edit | edit source]建立符號連結或其他型別的連結。從 Windows Vista 開始可用。
連結
MOVE
[edit | edit source]在目錄之間移動檔案或目錄,或重新命名它們。另請參閱 REN。
示例
- move File1.txt File2.txt
- 將 File1.txt 重新命名為 File2.txt,如果使用者確認或從批處理指令碼執行,則覆蓋 File2.txt。
- move File.txt Dir
- 將 File.txt 檔案移入 Dir 目錄,假設 File.txt 是一個檔案,而 Dir 是一個目錄;如果滿足覆蓋條件,則覆蓋目標檔案 Dir\a.txt。
- move Dir1 Dir2
- 將目錄 Dir1 重新命名為 Dir2,假設 Dir1 是一個目錄,而 Dir2 不存在。
- move Dir1 Dir2
- 將目錄 Dir1 移入 Dir2,導致 Dir2\Dir1 存在,假設 Dir1 和 Dir2 都是現有目錄。
- move F:\File.txt
- 將檔案移入當前目錄。
- move F:\*.txt
- 將位於 F:\ 且以點 txt 結尾的檔案移入當前目錄,假設當前目錄不是 F:\。
連結
PATH
[edit | edit source]輸出或設定 PATH 環境變數的值。輸出時,在輸出開頭包含 "PATH="。
示例
- path
- 輸出 PATH。示例輸出
- PATH=C:\Windows\system32;C:\Windows;C:\Program Files\Python27
- 輸出 PATH。示例輸出
- path C:\Users\Joe Hoe\Scripts;%path%
- 將 PATH 擴充套件為 C:\Users\Joe Hoe\Scripts,僅適用於 cmd.exe 的程序。
- path ;
- 清空 PATH。
- echo %path% | perl -pe "s/;/\n/g" | sort
- 如果您安裝了 perl,則顯示 PATH 中的資料夾,按排序順序。
連結
PAUSE
[edit | edit source]提示使用者並等待輸入一行。
連結
從目錄堆疊中彈出的驅動器和目錄的更改。目錄堆疊使用 PUSHD 命令填充。
連結
可用於更改或重置 cmd.exe 提示符。它設定 PROMPT 環境變數的值。
C:\>PROMPT MyPrompt$G
MyPrompt>CD
C:\
MyPrompt>PROMPT
C:\>
PROMPT 命令用於將提示符設定為“MyPrompt>”。CD 顯示當前目錄路徑為“C:\”。在沒有引數的情況下使用 PROMPT 會將提示符恢復到目錄路徑。
連結
將當前目錄推送到目錄堆疊中,使其可供 POPD 命令檢索,並且如果使用引數執行,則更改到作為引數宣告的目錄。
連結
刪除目錄。另見其同義詞 RMDIR 和反義詞 MD。預設情況下,只能刪除空目錄。還可以輸入“rd /?”。
示例
- rd Dir1
- rd Dir1 Dir2
- rd "My Dir With Spaces"
- rd /s Dir1
- 刪除目錄 Dir1,包括其中的所有檔案和子目錄,在繼續刪除之前詢問一次確認。要遞迴地刪除巢狀目錄中的檔案,並對每個檔案進行確認,請使用帶有 /s 開關的 DEL。
- rd /q /s Dir1
- 如上所述,但不詢問確認。
連結
重新命名檔案和目錄。
示例
- ren filewithtpyo.txt filewithtypo.txt
- ren *.cxx *.cpp
連結
- ss64.com 上的 ren
- Microsoft 上的 ren
- Windows RENAME 命令如何解釋萬用字元?,superuser.com
這是 REN 命令的同義詞。
用於批處理檔案中的備註,防止執行備註的內容。
一個例子
REM A remark that does not get executed
echo Hello REM This remark gets displayed by echo
echo Hello & REM This remark gets ignored as wished
:: This sentence has been marked as a remark using double colon.
REM 通常放在行首。如果放在命令後面,它不起作用,除非前面帶有與號,如上面的示例所示。
雙冒號是 REM 的替代方法。在括號中的序列中間使用它時會導致問題,例如在 FOR 迴圈中使用的那些。雙冒號似乎只是一個技巧,一個以冒號開頭的標籤。
連結
- ss64.com 上的 rem
- Microsoft 上的 rem
- 在批處理檔案中,我應該使用哪種註釋樣式?,stackoverflow.com
這是 RD 的同義詞。
輸出或設定環境變數。使用 /P 開關,它會向用戶詢問輸入,並將結果儲存在變數中。使用 /A 開關,它會執行簡單的算術運算,並將結果儲存在變數中。在字串賦值中,通常會避免等號前後有空格,因為它們會導致通常意想不到的後果:“set name = Peter”將賦值給變數“name ”,而“set name=Peter”將賦值給變數“name”。另見 #環境變數 和 #計算。
示例
- set
- 以 VAR=VALUE 的格式輸出環境變數及其值列表,每行一個變數。
- set home
- 以 VAR=VALUE 的格式輸出以“home”開頭的變數名稱的環境變數及其值列表,不區分大小寫,每行一個變數。
- set HOME
- 如上所述;變數名稱字首與變數名稱之間的匹配不區分大小寫。
- set myname=Joe Hoe
- 將變數設定為新值。
- set mynumber=56
- 將變數設定為字串值“56”。
- set mynumber=
- 取消設定變數,將其從變數中刪除。等號(=)必須是最後一個字元;在等號後面有任何空格,它們將成為變數的新值。
- set home=%home%;C:\Program Files\My Bin Folder
- set /P user_input=Enter an integer
- set /P firstline=< File.txt
- 將變數設定為檔案的第一行。等效於其他作業系統的 head -1 命令。
- set /A result = 4 * ( 6 / 3 )
- 使用計算結果設定結果變數。另見 #計算。
- set name = Peter
echo *%name %*- 將變數“name ”的值(結尾有空格)設定為“ Peter”(開頭有空格)的值。意圖可能是使用“set name=Peter”,沒有分隔空格。
連結
在批處理檔案中使用時,使對環境變數的所有後續更改都對當前批處理檔案區域性生效。在批處理檔案外部使用時,不執行任何操作。可以使用 ENDLOCAL 結束。退出批處理檔案會自動呼叫“end local”。可用於建立子程式:見 函式。
此外,可以用來啟用延遲擴充套件,如下所示:“setlocal EnableDelayedExpansion”。延遲擴充套件是指,只有在執行到達其使用位置後,才用其值替換用感嘆號括起來的變數名,而不是在更早的時間點替換。
以下是一個在指令碼中使用延遲擴充套件的示例,該指令碼列印檔案的指定數量的第一行,提供其他作業系統中已知的“head”命令的一些功能
@echo off
call :myhead 2 File.txt
exit /b
:: Function myhead
:: ===============
:: %1 - lines count, %2 - file name
:myhead
setlocal EnableDelayedExpansion
set counter=1
for /f "tokens=*" %%i in (%2) do (
echo %%i
set /a counter=!counter!+1
if !counter! gtr %1 exit /b
)
exit /b
連結
將批處理檔案引數沿著一併移動,但不影響 %*。因此,如果 %1=Hello 1,%2=Hello 2,%3=Hello 3,則在 SHIFT 後,%1=Hello 2,%2=Hello 3,但 %* 為“Hello 1” “Hello 2” “Hello 3”。
連結
在新視窗中啟動程式,或開啟文件。使用不清楚的演算法來確定第一個傳遞的引數是視窗標題還是要執行的程式;假設:它使用第一個引數周圍是否有引號作為提示,表示它是視窗標題。
示例
- start notepad.exe & echo "Done."
- 啟動 notepad.exe,在不等待啟動的程式完成的情況下繼續執行下一條命令。關鍵字:非同步。
- start "notepad.exe"
- 啟動一個新的控制檯視窗,其標題為 notepad.exe,這顯然是不可取的結果。
- start "" "C:\Program Files\Internet Explorer\iexplore.exe"
- 啟動 Internet Explorer。作為第一個引數傳遞的空 "" 是實際上沒有開啟的控制檯的視窗標題,或者至少不是可見的。
- start "C:\Program Files\Internet Explorer\iexplore.exe"
- 啟動一個新的控制檯視窗,其標題為“C:\Program Files\Internet Explorer\iexplore.exe”,這顯然是不可取的結果。
- start /wait notepad.exe & echo "Done."
- 啟動 notepad.exe,等待它結束再繼續執行。
- start /low notepad.exe & echo "Done."
- 如上所述,但以低優先順序啟動程式。
- start "" MyFile.xls
- 在分配用來開啟該文件的程式中開啟文件。
- start
- 在同一個當前資料夾中啟動一個新的控制檯(命令列視窗)。
- start .
- 在 Windows 資源管理器中開啟當前資料夾。
- start ..
- 在 Windows 資源管理器中開啟父資料夾。
- start "" "mailto:"
- 啟動用於編寫新電子郵件的應用程式。
- start "" "mailto:joe.hoe@hoemail.com?subject=Notification&body=Hello Joe, I'd like to..."
- 啟動用於編寫新電子郵件的應用程式,指定新電子郵件的收件人、主題和正文。
- start "" "mailto:joe.hoe@hoemail.com?subject=Notification&body=Hello Joe,%0a%0aI'd like to..."
- 如上所述,使用 %0a 輸入換行符。
- start /b TODO:example-application-where-this-is-useful
- 啟動應用程式,但不開啟新的控制檯視窗,將輸出重定向到呼叫 start 命令的控制檯。
連結
- ss64.com 上的 start
- Microsoft 上的 start
- 如何在 Outlook 中使用命令列開關建立預先地址的電子郵件?,support.microsoft.com
輸出或設定系統時間。另請參見#DATE和#Special variable names中的TIME變數。
示例
- time /t
- 以HH:MM格式輸出系統時間,不包括秒和毫秒。例如:09:19。
- time
- 以特定於區域設定的格式輸出系統時間,可能包含秒和百分之一秒,並提示設定新的時間;時間前面會顯示特定於區域設定的訊息,通常是“當前時間:”的翻譯。因此,輸出格式與“time /t”不同。
- echo %time%
- 使用特殊變數TIME以特定於區域設定的格式輸出當前時間,包含小時、分鐘、秒,以及可能包含的百分之一秒。某個區域設定的示例輸出:9:19:31.55。
- echo %time% & timeout 1 >nul & echo,|time
- 輸出中間命令(此處為timeout 1)前後時間。可用於測量中間序列的執行時間;關鍵詞:需要多長時間。
連結
TITLE
[edit | edit source]設定在控制檯視窗中顯示的標題。
連結
TYPE
[edit | edit source]將檔案或檔案的內容列印到輸出。
示例
- type filename.txt
- type a.txt b.txt
- type *.txt
- type NUL > tmp.txt
- 建立一個空檔案(空白檔案)。
連結
VER
[edit | edit source]顯示命令處理器或作業系統版本。
C:\>VER
Microsoft Windows XP [Version 5.1.2600]
C:\>
一些版本字串
- Microsoft Windows [Version 5.1.2600]
- 適用於 Windows XP
- Microsoft Windows [Version 6.0.6000]
- 適用於 Windows Vista
- ...
單詞“version”已本地化。
連結
- ver at ss64.com
- ver at Microsoft
- Operating System Version at Microsoft
- List of Microsoft Windows versions, wikipedia.org
- Windows Build Numbers, eddiejackson.net
- mxpv/windows_build_numbers.txt, gist.github.com
VERIFY
[edit | edit source]設定或清除是否驗證COPY檔案等的寫入是否正確。
連結
VOL
[edit | edit source]輸出卷標。
連結
外部命令
[edit | edit source]Windows 命令直譯器可用的外部命令是獨立的可執行程式檔案,由 Microsoft 隨作業系統一起提供,或作為標準捆綁在第三方命令直譯器中。透過替換程式檔案,可以更改這些命令的含義和功能。
許多(但不是全部)外部命令支援“/?”約定,使它們能夠將其線上使用資訊寫入標準輸出,然後以狀態程式碼 0 退出。
ARP
[edit | edit source]輸出或更改地址解析協議快取中的專案,該快取將 IP 地址對映到物理地址。
連結
AT
[edit | edit source]安排程式在特定時間執行。另請參見SCHTASKS。
連結
ATTRIB
[edit | edit source]輸出或設定檔案屬性。如果沒有引數,它將輸出當前目錄中所有檔案的屬性。如果沒有屬性修改指令,它將輸出與給定搜尋萬用字元規範匹配的檔案和目錄的屬性。類似於其他作業系統的chmod。
修改指令
- 要新增屬性,請在其字母前附加“+”。
- 要刪除屬性,請在其字母前附加“-”。
- 屬性
- A - 已歸檔
- H - 隱藏
- S - 系統
- R - 只讀
- …以及其他一些。
示例
- attrib
- 輸出當前目錄中所有檔案的屬性。
- attrib File.txt
- 輸出檔案的屬性。
- attrib +r File.txt
- 向檔案新增“只讀”屬性。
- attrib -a File.txt
- 從檔案刪除“已歸檔”屬性。
- attrib -a +r File.txt
- 從檔案刪除“已歸檔”屬性,並向檔案新增“只讀”屬性。
- attrib +r *.txt
- 作用於一組檔案。
- attrib /S +r *.txt
- 在子目錄中遞迴操作。
有關更多資訊,請鍵入“attrib /?”。
連結
BCDEDIT
[edit | edit source](XP 中沒有)。編輯啟動配置資料 (BCD) 檔案。有關更多資訊,請鍵入“bcdedit /?”。
連結
CACLS
[edit | edit source]輸出或更改任意訪問控制列表 (DACL)。另請參見ICACLS。有關更多資訊,請鍵入“cacls /?”。
連結
CHCP
[edit | edit source]輸出或設定活動內碼表編號。有關更多資訊,請鍵入“chcp /?”。
連結
CHKDSK
[edit | edit source]檢查磁碟是否存在磁碟問題,列出這些問題,並在需要時修復它們。有關更多資訊,請鍵入“chkdsk /?”。
連結
CHKNTFS
[edit | edit source]顯示或設定計算機啟動時是否應執行系統檢查。系統檢查使用 Autochk.exe 完成。命令名稱中的“NTFS”部分具有誤導性,因為該命令不僅適用於 NTFS 檔案系統,還適用於 FAT 和 FAT32 檔案系統。有關更多資訊,請鍵入“chkntfs /?”。
連結
CHOICE
[edit | edit source]允許使用者透過按下單個鍵從多個選項中選擇一個選項,並將錯誤級別設定為與所選選項匹配的級別。該命令在 Windows 2000 和 Windows XP 中不存在,在 Windows Vista 中重新引入,並在 Windows 7 和 8 中保留。
示例
- choice /m "Do you agree"
- 向用戶顯示一個是/否問題,將錯誤級別設定為 1 表示是,設定為 2 表示否。如果使用者按下 Ctrl + C,則錯誤級別為 0。
- choice /c rgb /m "Which color do you prefer"
- 向用戶顯示一個問題,並指示使用者的字母。響應使用者按下 r、g 或 b,將錯誤級別設定為 1、2 或 3。
另一種方法是“set /p”;請參見SET。
連結
CIPHER
[edit | edit source]顯示加密狀態,加密或解密 NTFS 捲上的資料夾。
連結
CLIP
[edit | edit source](XP 中沒有此命令,或從 Server 2003 複製) 將管道輸入到剪貼簿。
示例
- set | clip
- 將環境變數列表放到剪貼簿。
- clip < File1.txt
- 將 File1.txt 的內容放到剪貼簿。
連結
CMD
[edit | edit source]呼叫另一個 Microsoft 的 CMD 例項。
連結
COMP
[edit | edit source]比較檔案。另請參閱 FC。
連結
COMPACT
[edit | edit source]顯示或更改 NTFS 分割槽上檔案或資料夾的壓縮狀態。
連結
CONVERT
[edit | edit source]將卷從 FAT16 或 FAT32 檔案系統轉換為 NTFS 檔案系統。
連結
DEBUG
[edit | edit source]允許以互動方式在組合語言、十六進位制或 ASCII 中檢查檔案和記憶體內容。可在 32 位 Windows(包括 Windows 7)中使用;在 64 位 Windows 中的可用性尚不清楚。在現代 Windows 中,可作為快速檢視檔案十六進位制內容的便捷工具。關鍵詞:十六進位制轉儲、hexdump、十六進位制轉儲、檢視十六進位制、檢視十六進位制、反彙編。
Debug 擁有自己的命令列。在命令列上,鍵入 "?" 以瞭解 debug 命令。
要檢視檔案的十六進位制,使用檔名作為引數呼叫 debug.exe,然後在 debug 命令列上重複鍵入 "d" 後跟回車。
限制
- 作為 DOS 程式,debug 會對長檔名感到困惑。使用 dir /x 查詢 8.3 檔名,然後對該檔名應用 debug。
- Debug 無法檢視較大的檔案。
連結
- Debug for Windows XP at TechNet / Microsoft Docs
- Debug for MS-DOS at TechNet / Microsoft Docs
- W:Debug (命令)
DISKCOMP
[edit | edit source]比較兩張軟盤的內容。
連結
DISKCOPY
[edit | edit source]將一張軟盤的內容複製到另一張軟盤。
連結
DISKPART
[edit | edit source]顯示和配置磁碟分割槽的屬性。
連結
DOSKEY
[edit | edit source]最重要的是,建立宏,在其他作業系統中稱為別名。此外,還提供與命令歷史記錄相關的功能以及增強的命令列編輯功能。宏是簡短批處理指令碼的替代方案。
與宏相關的示例
- doskey da=dir /s /b
- 建立單個名為 "da" 的宏。
- doskey np=notepad $1
- 建立單個宏,將第一個引數傳遞給記事本。
- doskey /macrofile=doskeymacros.txt
- 從檔案載入宏定義。
- doskey /macros
- 列出所有定義的宏及其定義。
- doskey /macros | find "da"
- 列出所有包含 "da" 作為子字串的宏定義;另請參閱 FIND。
與命令歷史記錄相關的示例
- doskey /history
- 列出完整的命令歷史記錄。
- doskey /history | find "dir"
- 列出命令歷史記錄中包含 "dir" 作為子字串的每一行
- doskey /listsize=100
- 將命令歷史記錄的大小設定為 100。
要從命令列獲取 doskey 的幫助,鍵入 "doskey /?"。
連結
DRIVERQUERY
[edit | edit source]顯示所有已安裝的裝置驅動程式及其屬性。
連結
EXPAND
[edit | edit source]從壓縮的 .cab 壓縮包檔案中解壓縮檔案。另請參閱 #MAKECAB。
連結
FC
[edit | edit source]比較檔案,以一種特殊的方式顯示其內容的差異。
示例
- fc File1.txt File2.txt >NUL && Echo Same || echo Different or error
- 使用 fc 的錯誤級別檢測差異。錯誤級別為零表示檔案相同;非零可能表示檔案不同,也可能表示其中一個檔案不存在。
連結
FIND
[edit | edit source]在檔案或輸入中搜索字串,輸出匹配的行。與 FINDSTR 不同,它無法遞迴搜尋資料夾,無法搜尋正則表示式,需要對搜尋字串使用引號,並且將空格視為字面含義而不是邏輯或。
示例
- find "(object" *.txt
- dir /S /B | find "receipt"
- dir /S /B | find /I /V "receipt"
- 列印 dir 命令輸出中所有不匹配的行,忽略字母大小寫。
- find /C "inlined" *.h
- 不輸出匹配的行,而是輸出其計數。如果搜尋多個檔案,則為每個檔案輸出一個計數數字,前面是一系列破折號,後面是檔名;不輸出所有檔案中匹配行的總數。
- find /C /V "" < file.txt
- 輸出 "file.txt" 中的行數,即行計數。完成其他作業系統中 "wc -l" 的工作。透過將 "" 視為行中找不到的字串來實現。重定向的使用可以防止檔名在行數之前輸出。
- type file.txt | find /C /V ""
- 與上面類似,但語法不同。
- type *.txt 2>NUL | find /C /V ""
- 輸出當前資料夾中以 ".txt" 結尾的檔案的行計數的總和。"2>NUL" 是標準錯誤的重定向,它從輸出中刪除檔名後跟空行的內容。
- find "Schönheit" *.txt
- 如果從以 unicode UTF-8 編碼儲存的批處理檔案中執行,則在 UTF-8 編碼的 *.txt 檔案中搜索搜尋詞 "Schönheit"。要使此功能正常工作,批處理檔案必須不包含記事本在 UTF-8 中儲存時寫入的位元組順序標記。Notepad++ 是一個示例,它允許您在沒有位元組順序標記的情況下寫入 UTF-8 編碼的純文字檔案。雖然此功能適用於 find 命令,但不適用於 #FINDSTR。
- find "Copyright" C:\Windows\system32\a*.exe
- 對二進位制檔案的工作原理與文字檔案相同。
連結
FINDSTR
[edit | edit source]在檔案中搜索正則表示式或文字字串。它可以完成其他作業系統中“grep”命令的一部分工作,但在支援的正則表示式方面要有限得多。
除非使用 /c 選項阻止,否則將正則表示式中的空格視為析取,即邏輯或。
示例
- findstr /s "[0-9][0-9].*[0-9][0-9]" *.h *.cpp
- 遞迴搜尋所有以點 h 或點 cpp 結尾的檔案,只打印包含兩個連續的十進位制數字,然後是任何內容,然後是兩個連續的十進位制數字的行。
- findstr "a.*b a.*c" File.txt
- 輸出 File.txt 中匹配由空格分隔的兩個正則表示式中的任何一個的所有行。因此,其效果是正則表示式的邏輯或。
- echo world | findstr "hello wo.ld"
- 不匹配。由於空格前的第一個專案看起來不像正則表示式,findstr 將整個搜尋詞視為普通搜尋詞。
- echo world | findstr /r "hello wo.ld"
- 匹配。使用 /r 強制進行正則表示式處理。
- findstr /r /c:"ID: *[0-9]*" File.txt
- 輸出 File.txt 中匹配包含空格的單個正則表示式的所有行。使用 /c 阻止將空格視為邏輯或。使用 /r 開啟正則表示式處理,預設情況下,/c 將其停用。要測試這一點,請嘗試以下操作
- echo ID: 12|findstr /r /c:"ID: *[0-9]*$"
- 匹配。
- echo ID: 12|findstr /c:"ID: *[0-9]*$"
- 不匹配,因為搜尋字串不被解釋為正則表示式。
- echo ID: abc|findstr "ID: *[0-9]*$"
- 儘管 echo 的輸出未能匹配完整的正則表示式,但它仍然匹配:搜尋被解釋為查詢匹配“ID:”或“*[0-9]*$”的行。
- echo ID: 12|findstr /r /c:"ID: *[0-9]*$"
- 輸出 File.txt 中匹配包含空格的單個正則表示式的所有行。使用 /c 阻止將空格視為邏輯或。使用 /r 開啟正則表示式處理,預設情況下,/c 將其停用。要測試這一點,請嘗試以下操作
- findstr /ric:"id: *[0-9]*" File.txt
- 與前一個示例相同,但以不區分大小寫的形式。
- 雖然 findstr 允許在單個“/”後面累積這種型別的開關,但這在任何命令中都不可能。例如,“dir /bs”不起作用,而“dir /b /s”則起作用。
- 要測試這一點,請嘗試以下操作
- echo ID: 12|findstr /ric:"id: *[0-9]*$"
- echo ID: ab|findstr /ric:"id: *[0-9]*$"
- findstr /msric:"id: *[0-9]*" *.txt
- 與上面一樣,但對所有檔案遞迴執行 /s,顯示匹配的檔案而不是匹配的行 /m。
- echo hel lo | findstr /c:"hel lo" /c:world
- /c 開關可以使用多次來建立邏輯或。
- echo \hello\ | findstr "\hello\"
- 不匹配。引號前的反斜槓和其他多個字元充當轉義符;因此,\" 匹配 "。
- echo \hello\ | findstr "\\hello\\"
- 匹配。傳遞給 findstr 的雙反斜槓代表單個反斜槓。
- echo \hello\ | findstr \hello\
- 匹配。傳遞給 findstr 的單個反斜槓後面都沒有用於反斜槓充當轉義符的字元。
- echo ^"hey | findstr \^"hey | more
- 要搜尋引號(雙引號),你需要對其進行兩次轉義:一次是使用插入符號(^)對 shell 進行轉義,另一次是使用反斜槓(\)對 findstr 進行轉義。
- echo ^"hey | findstr ^"\^"hey there^" | more
- 要搜尋引號並將搜尋詞也用引號括起來,則需要對 shell 使用插入符號(^)對包圍的引號進行轉義。
- echo //comment line | findstr \//
- 如果正斜槓(/)是搜尋詞的第一個字元,則需要使用反斜槓(\)對其進行轉義。即使搜尋詞用引號括起來,也需要進行轉義。
- findstr /f:FileList.txt def.*()
- 在 FileList.txt 中宣告的檔案中搜索,每行一個檔案。FileList.txt 中的檔名可以包含空格,並且不需要用引號括起來才能正常工作。
- findstr /g:SearchTermsFile.txt *.txt
- 搜尋 SearchTermsFile.txt 中找到的搜尋詞,每行一個搜尋詞。空格不能用於分隔兩個搜尋詞;而是,每行都是一個完整的搜尋詞。如果至少有一個搜尋詞匹配,則匹配該行。如果第一個搜尋詞看起來像正則表示式,則搜尋將是正則表示式搜尋,但如果它看起來像普通搜尋詞,則整個搜尋將是普通搜尋,即使第二個或更後面的搜尋詞看起來像正則表示式。
- findstr /xlg:File1.txt File2.txt
- 輸出集合交集:兩個檔案中都存在的行。
- findstr /xlvg:File2.txt File1.txt
- 輸出集合差集:File1.txt - File2.txt。
- findstr /m Microsoft C:\Windows\system32\*.com
- 對二進位制檔案的工作原理與文字檔案相同。
與“grep”相比,“findstr”正則表示式的侷限性
- 不支援組——“\(”,“\)”。
- 不支援貪婪迭代器——“*?”。
- 不支援“前一個的零個或一個”——“?”。
- 還有更多。
其他限制:如Windows FINDSTR 命令有哪些未記錄的功能和限制?中所述,存在各種限制和奇怪的行為。
錯誤
- echo bb|findstr "bb baaaa"
- 在多個 Windows 版本中都無法找到任何內容,但它應該能夠找到。
也可以考慮輸入“findstr /?”。
連結
- ss64.com 上的 findstr
- Microsoft 上的 findstr
- Windows FINDSTR 命令有哪些未記錄的功能和限制? 在 StackOverflow 上
FORFILES
[edit | edit source]根據修改日期和檔名模式查詢檔案,並對每個找到的檔案執行命令。非常有限,尤其是與其他作業系統的 find 命令相比。從 Windows Vista 開始可用。有關更多資訊,請鍵入“forfiles /?”。
示例
- forfiles /s /d 06/10/2015 /c "cmd /c echo @fdate @path"
- 對當前資料夾及其子資料夾中於 2015 年 6 月 10 日或之後修改的每個檔案,輸出檔案修改日期和完整檔案路徑。/d 後的日期格式是特定於區域設定的。因此,可以用來查詢最近修改的檔案。關鍵詞:最近修改的檔案。
- forfiles /m *.txt /s /d 06/10/2015 /c "cmd /c echo @fdate @path"
- 與上面一樣,但只針對以 .txt 結尾的檔案。
連結
forfiles /?
FORMAT
[edit | edit source]將磁碟格式化為使用 Windows 支援的檔案系統(如 FAT、FAT32 或 NTFS),從而覆蓋磁碟上的先前內容。請謹慎使用。
連結
FSUTIL
[edit | edit source]一個功能強大的工具,用於執行與 FAT 和 NTFS 檔案系統相關的操作,理想情況下,只有具有廣泛作業系統知識的資深使用者才能使用它。
連結
GPRESULT
[edit | edit source]為使用者或計算機輸出組策略設定等內容。
連結
GRAFTABL
[edit | edit source]在圖形模式下啟用擴充套件字元集的顯示。有關更多資訊,請鍵入“graftabl /?”。
連結
HELP
[edit | edit source]顯示命令幫助。
示例
- help
- 顯示 Windows 提供的命令列表。
- help copy
- 顯示 COPY 命令的幫助,也可以透過鍵入“copy /?”獲得。
連結
ICACLS
[edit | edit source](XP 中沒有)顯示或更改檔案或資料夾的任意訪問控制列表(DACL)。另請參見CACLS。有關更多資訊,請鍵入“icacls /?”。
連結
IPCONFIG
[edit | edit source]輸出 Windows IP 配置。顯示按連線的配置以及該連線的名稱(即乙太網介面卡本地連線)。在其下方,將顯示與該連線相關的特定資訊,例如 DNS 字尾、IP 地址和子網掩碼。
連結
新增、設定或刪除磁碟標籤。
連結
將檔案放入壓縮的 .cab 壓縮檔案中。另請參見 #EXPAND.
連結
一個多用途命令,用於顯示裝置狀態、配置埠和裝置等等。
示例
- mode
- 輸出所有裝置(例如 com3 和 con)的狀態和配置。
- mode con
- 輸出 con 裝置(命令直譯器正在執行的控制檯)的狀態和配置。
- mode con cols=120 lines=20
- 設定當前控制檯的列數和行數,導致視窗調整大小,並清除螢幕。此設定不會影響新的控制檯例項。關鍵詞:寬螢幕、寬視窗、螢幕大小、視窗大小、調整螢幕大小、調整視窗大小。
- mode 120, 20
- 同上:設定列數(120)和行數(20),導致視窗調整大小,並清除螢幕。
- mode con cols=120
- 設定當前控制檯的列數,導致視窗調整大小,並清除螢幕。它似乎也改變了可見行數,但控制檯緩衝區的總行數似乎沒有改變。
- mode 120
- 同上:設定列數。
- mode con cp
- 輸出控制檯的當前內碼表。
- mode con cp select=850
- 設定控制檯的當前內碼表。有關內碼表列表,請參閱下面連結的 Microsoft 文件。
- mode con rate=31 delay=1
- 設定控制檯在按下某個鍵時重複輸入字元的速率和延遲。速率越低,每秒的重複次數越少。
連結
一次輸出一個螢幕的檔案或多個檔案的內容。當重定向到檔案時,也會執行一些轉換,具體取決於使用的開關。
示例
- more Test.txt
- more *.txt
- grep -i sought.*string Source.txt | more /p >Out.txt
- 獲取非 Windows grep 命令的輸出,該命令生成的換行符僅包含 LF 字元,不包含 CR 字元,將 LF 換行符轉換為 CR-LF 換行符。CR-LF 換行符也稱為 DOS 換行符、Windows 換行符、DOS 換行符、Windows 換行符和 CR/LF 行尾,與某些其他作業系統使用的 LF 換行符相反。
- 在某些設定中,如果輸入包含 LF 換行符和製表符,則似乎會輸出亂碼。
- 在某些設定中,對於轉換,/p 可能不需要。因此,“more”即使沒有 /p 也會轉換換行符。
- more /t4 Source.txt >Target.txt
- 將製表符轉換為 4 個空格。
- 在某些設定中,製表符轉換會自動進行,即使沒有 /t 開關。如果是這樣,預設情況下是 8 個空格。
開關 /e
- Windows XP 和 Windows Vista 中“more”的線上文件沒有提到此開關。
- 至少在 Windows XP 和 Windows Vista 中,“more /?” 中提到了 /e 開關。
- 根據“more /?”,該開關應該啟用“more /?” 幫助末尾列出的擴充套件功能,例如在按下“=”時顯示當前行。但是,在 Windows XP 和 Windows Vista 中,即使沒有 /e,該功能似乎也預設啟用。
- 假設:在 Windows XP 和 Windows Vista 中,/e 沒有任何作用;它存在是為了相容性原因。
連結
- more at ss64.com
- more at Microsoft, Windows XP
- more at Microsoft, Windows Server 2008, Windows Vista
提供各種網路服務,具體取決於使用的命令。每個命令可用的變體
- net accounts
- net computer
- net config
- net continue
- net file
- net group
- net help
- net helpmsg
- net localgroup
- net name
- net pause
- net print
- net send
- net session
- net share
- net start
- net statistics
- net stop
- net time
- net use
- net user
- net view
連結
- net at ss64.com
- net services overview at Microsoft, Windows XP
執行與開啟檔案相關的操作,尤其是那些透過網路由其他使用者開啟的檔案。這些操作包括查詢、顯示和斷開連線。有關更多資訊,請鍵入“openfiles /?”。
連結
語法
- PING /?
- PING address
- PING hostname
透過網路向指定的地址(或指定的 hostname 透過名稱查詢對映到的第一個 IP 地址)傳送 ICMP/IP“回顯”資料包,並列印所有收到的響應。
示例
- ping en.wikibooks.org
- ping 91.198.174.192
- ping https://wikibook.tw/
- 無法正常工作。
連結
從有缺陷磁碟上的損壞檔案中恢復儘可能多的資訊。
連結
查詢或修改 Windows 登錄檔。
第一個引數是以下命令之一:query、add、delete、copy、save、load、unload、restore、compare、export、import 和 flags。若要詳細瞭解某個命令,請在後面加上 /?,例如 reg query /?。
連結
用原始檔夾中相同名稱的檔案替換目標資料夾中的檔案。
連結
(XP 中沒有)複製檔案和資料夾。另請參見 XCOPY 和 COPY.
示例
- robocopy /s C:\Windows\system C:\Windows-2\system *.dll
- 將所有以 .dll 結尾的檔案從一個目錄複製到另一個目錄,複製巢狀的目錄結構。
連結
執行 DLL 中可用的函式。可用的 DLL 及其函式在不同的 Windows 版本之間有所不同。
示例
- rundll32 sysdm.cpl,EditEnvironmentVariables
- 在某些 Windows 版本中,開啟用於編輯環境變數的對話方塊。
連結
- rundll32 at ss64.com
- at Microsoft
- rundll at robvanderwoude.com
- dx21.com - 列出 rundll32 示例
控制 Windows 服務,支援啟動、停止、查詢等操作。Windows 服務類似於程序。Windows 服務要麼在自己的程序中託管,要麼在 svchost.exe 程序的例項中託管,通常在一個例項中託管多個服務。可以使用 Sysinternals 免費下載的 Process Explorer 檢視特定服務的處理器時間使用情況,方法是轉到服務的屬性,然後轉到執行緒選項卡。另一個可以控制服務的命令是 NET。 TASKLIST 可以使用 /svc 開關列出託管的服務。
示例
- sc start wuauserv
- 啟動 wuauserv 服務。
- sc stop wuauserv
- sc query wuauserv
- sc query
- 輸出所有服務的相關資訊。
- sc config SysMain start= disabled
- 確保 SysMain 服務在啟動後處於停用狀態。SysMain 是 SuperFetch 服務,它會透過嘗試猜測哪些程式要載入到 RAM 中(以防將來需要使用),然後載入它們,從而導致硬碟頻繁活動。請注意,等號前必須沒有空格,等號後必須有空格。
連結
SCHTASKS
[edit | edit source]安排程式在特定時間執行,比 AT 更強大。
連結
SETX
[edit | edit source]類似於 SET,但它影響的是整個機器,而不是當前的控制檯或程序。Windows XP 中不可用;Windows Vista 及更高版本可用。
連結
- setx at ss64.com
- setx at Microsoft, Windows Server 2008, Windows Vista
SHUTDOWN
[edit | edit source]關閉計算機或登出當前使用者。
示例
- shutdown /s
- 關閉計算機。
- shutdown /s /t 0
- 立即關閉計算機。
- shutdown /l
- 登出當前使用者。
連結
SORT
[edit | edit source]按字母順序排序,從 A 到 Z 或從 Z 到 A,不區分大小寫。無法按數字排序:如果輸入包含每行一個整數,“12” 在 “9” 之前。
示例
- sort File.txt
- 輸出 File.txt 的排序內容。
- sort /r File.txt
- 按反向順序排序,從 Z 到 A。
- dir /b | sort
連結
SUBST
[edit | edit source]將驅動器號分配給本地資料夾,輸出當前分配,或刪除分配。
示例
- subst p: .
- 將 p: 分配給當前資料夾。
- subst
- 輸出之前使用 subst 進行的所有分配。
- subst /d p
- 刪除 p: 分配。
連結
SYSTEMINFO
[edit | edit source]顯示計算機及其作業系統的配置。
連結
TASKKILL
[edit | edit source]結束一個或多個任務。
示例
- taskkill /im AcroRd32.exe
- 結束所有名為 “AcroRd32.exe” 的程序;因此,結束所有開啟的 Acrobat Reader 例項。可以使用 tasklist 查詢名稱。
- taskkill /f /im AcroRd32.exe
- 如上所示,但採用 *強制* 模式。在結束某些沒有使用 /f 無法結束的程序時會成功。
- tasklist | find "notepad"
taskkill /PID 5792
- 結束程序 ID(PID)為 5792 的程序(又稱任務);假設您已使用 tasklist 找到 PID。
連結
TASKLIST
[edit | edit source]列出任務,包括任務名稱和程序 ID(PID)。
示例
- tasklist | sort
- tasklist | find "AcroRd"
- tasklist | find /C "chrome.exe"
- 輸出名為 “chrome.exe” 的任務數量,這些任務屬於 Google Chrome 瀏覽器。
- tasklist /svc | findstr svchost
- 輸出在 svchost.exe 程序中託管的 Windows 服務,以及有關程序的常規資訊。
連結
TIMEOUT
[edit | edit source]等待指定秒數,顯示剩餘秒數,允許使用者透過按任意鍵中斷等待。也稱為延遲或睡眠。Windows Vista 及更高版本可用。
示例
- timeout /t 5
- 等待五秒鐘,允許使用者透過按任意鍵取消等待。
- timeout /t 5 /nobreak
- 等待五秒鐘,忽略使用者輸入,除了 Ctrl + C。
- timeout /t 5 /nobreak >nul
- 如上所示,但沒有輸出。
Windows XP 中的解決方法
- ping -n 6 127.0.0.1 >nul
- 等待五秒鐘;-n 後的數字是等待的秒數加 1。
Windows XP 中基於 Perl 的解決方法,需要安裝 Perl
- perl -e "sleep 5"
- 等待 5 秒。
連結
- timeout at ss64.com
- timeout at Microsoft
- 如何在批處理指令碼中等待? at stackoverflow.com
- 在批處理檔案中休眠 at stackoverflow.com
TREE
[edit | edit source]輸出當前目錄所有子目錄的樹形結構,直到任何遞迴或深度級別。如果與 /F 開關一起使用,則不僅輸出子目錄,還輸出檔案。
示例
- tree
- tree /f
- 除了目錄外,還包含檔案列表。
- tree /f /a
- 如上所示,但使用 7 位 ASCII 字元(包括 “+”、“-” 和 “\”)來繪製樹形結構。
使用 8 位 ASCII 字元繪製的樹形結構片段
├───winevt │ ├───Logs │ └───TraceFormat ├───winrm
使用 7 位 ASCII 字元繪製的樹形結構片段
+---winevt | +---Logs | \---TraceFormat +---winrm
連結
WHERE
[edit | edit source]輸出檔案或檔名模式的一個或多個位置,其中檔案或模式不需要宣告副檔名(如果它在 PATHEXT 中列出,例如 .exe)。預設情況下,在當前目錄和 PATH 中搜索。完成某些其他作業系統中 “which” 命令的工作,但更靈活。
Windows 2003、Windows Vista、Windows 7 及更高版本可用;Windows XP 中不可用。下面示例中提供了一個可在 Windows XP 中使用的替代方案。
找不到內部命令,因為它們沒有與之匹配的 .exe 檔案。
示例
- where find
- 輸出 find 命令的位置,可能是 “C:\Windows\System32\find.exe”。只要副檔名在 PATHEXT 中列出,就不需要指定 .exe 副檔名,預設情況下它已列出。
- 如果路徑中存在多個 find 命令,則輸出兩個命令的路徑。在某些情況下,它可能會輸出以下內容
C:\Windows\System32\find.exe
C:\Program Files\GnuWin32\bin\find.exe
- for %i in (find.exe) do @echo %~$PATH:i
- 輸出 Windows XP 中 “find.exe” 的位置。與 where 命令不同,名稱必須包含 “.exe”。
- where /r . Tasks*
- 從當前資料夾遞迴搜尋名稱匹配 “Task*” 的檔案。類似於 “dir /b /s Tasks*”。/r 開關停用在 PATH 中的資料夾中搜索。
- where *.bat
- 輸出當前目錄和 PATH 中的目錄中所有 .bat 檔案。因此,輸出所有無需輸入其完整路徑即可執行的 .bat 檔案。
- where ls*.bat
- 如上所示,還限制 .bat 檔名的開頭。
- where ls*
- 如上所示,但對副檔名沒有限制。如果在當前目錄或路徑中,則查詢 lsdisks.bat、lsmice.pl 和 lsmnts.py。
- where *.exe *.com | more
- 輸出路徑和當前資料夾中無數的 .exe 和 .com 檔案,包括 C:\Windows\System32 中的檔案。
- where $path:*.bat
- 輸出路徑中的 .bat 檔案,但不出於當前資料夾中的檔案,除非當前資料夾在 PATH 中。可以使用包含目錄列表的其他環境變數來代替路徑。
- where $windir:*.exe
- 輸出在 WINDIR 環境變數中宣告的資料夾中找到的 .exe 檔案。
- where $path:*.bat $windir:*.exe
- 可以進行組合。輸出與這兩個查詢匹配的所有檔案。
- where /q *.bat && echo Found
- 抑制標準輸出和錯誤輸出,但設定錯誤級別,允許對其進行測試。無論是否使用 /q,都會設定錯誤級別。
連結
啟動 Windows 管理體系結構命令列 (WMIC),或者在給出引數的情況下,將引數作為命令傳遞給 WMIC。Windows XP Home 中沒有。有關更多資訊,請鍵入 "wmic /?"。
示例
- wmic logicaldisk get caption,description
- 列出在驅動器號下可訪問的驅動器(磁碟),無論本地硬碟驅動器、CD-ROM 驅動器、可移動快閃記憶體驅動器、網路驅動器還是使用 #SUBST 建立的驅動器。
- wmic logicaldisk get /format:list
- 輸出 "logicaldisk" 物件的所有屬性,每行一個屬性。
- wmic logicaldisk get /format:csv
- wmic
Control + C- 進入 wmic,然後中斷它。一個副作用是控制檯緩衝區變得非常寬,並且螢幕因此可以使用滑鼠水平調整大小。這是 wmic 設定控制檯列數過高的結果,您可以使用 mode con 驗證。您也可以透過鍵入 mode 1500 來實現類似的效果。另請參閱 #MODE。
- wmic datafile where name="C:\\Windows\\System32\\cmd.exe" get Version /value
- 輸出 cmd.exe 的版本,該版本應接近 Windows 版本。
- wmic os get TotalVisibleMemorySize
- 輸出總物理記憶體大小。
- wmic os get TotalVirtualMemorySize
- 輸出總虛擬記憶體大小。
- wmic os get /format:list
- 輸出 "os" 物件的所有屬性,每行一個屬性。
連結
以比 COPY 更高階的方式複製檔案和目錄,在 Windows Vista 及更高版本中被棄用,有利於使用 ROBOCOPY。鍵入 xcopy /? 以瞭解詳細資訊,包括無數選項。
示例
- xcopy C:\Windows\system
- 複製所有檔案,但不復制巢狀資料夾中的檔案,從原始檔夾 ("C:\Windows\system") 複製到當前資料夾。
- xcopy /s /i C:\Windows\system C:\Windows-2\system
- 複製所有檔案和資料夾到任何巢狀深度(透過 "/s"),從原始檔夾 ("C:\Windows\system") 複製到 "C:\Windows-2\system",如果 "Windows-2\system" 不存在則建立它(透過 "/i")。
- xcopy /s /i /d:09-01-2014 C:\Windows\system C:\Windows-2\system
- 如上所述,但僅複製 2014 年 9 月 1 日或之後更改的檔案。請注意,即使您使用的是非美國地區的 Windows,也使用月優先的約定。
- xcopy /L /s /i /d:09-01-2014 C:\Windows\system C:\Windows-2\system
- 如上所述,但在測試模式下透過 /L (僅列表、僅輸出、僅顯示)。因此,不執行任何實際複製,只是列出將要複製的內容。
- xcopy /s /i C:\Windows\system\*.dll C:\Windows-2\system
- 與上述示例之一類似,但僅複製以 .dll 結尾的檔案,包括巢狀資料夾中的檔案。
連結
- PowerShell -- 用於指令碼 Windows 作業系統的現代技術
- VBScript 程式設計 -- 一種遺留的 Windows 指令碼技術,其語法類似於 Visual Basic
- Windows CMD 命令在 ss64.com -- 授權許可為知識共享署名-非商業性使用-相同方式共享 2.0 英國:英格蘭和威爾士 [1],因此與 Wikibooks 使用的 CC-BY-SA 不相容
- Windows XP - 命令列參考 A-Z 在 microsoft.com
- Windows Server 2008R2 - 命令列參考 在 microsoft.com
- Windows Server 2012R2 - 命令列參考 在 microsoft.com
- Windows Server 2016 - Windows 命令 在 microsoft.com
- FreeDOS HTML 幫助 在 fdos.org -- FreeDOS 命令的超文字幫助系統,寫於 2003/2004 年,在 GNU 自由文件許可證 下提供
- 類別:批處理檔案,rosettacode.org
- Cmd.exe,wikipedia.org
- 批處理檔案,wikipedia.org