跳轉到內容

Windows 批處理指令碼

50% developed
來自華夏公益教科書

本書描述並展示瞭如何使用微軟提供的命令直譯器 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,它們的微軟提供的命令直譯器實際上是 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 庫;但是,這需要安裝。

使用 Windows 命令直譯器

[編輯 | 編輯原始碼]

命令列的解釋方式

[編輯 | 編輯原始碼]

將命令列解析為一系列命令是一個複雜的過程。主要有四個組成部分

  1. 變數替換:掃描命令列以查詢變數說明,並用這些變數的內容替換任何找到的變數說明。
  2. 引用:特殊字元可以被引用,以消除它們的特殊含義。
  3. 語法:根據語法將命令列開發成一系列命令。
  4. 重定向:在執行序列中的單個命令之前,應用重定向說明並將其從命令列中移除。

變數替換

[編輯 | 編輯原始碼]

命令列可以包含變數說明。這些說明由一個 % 字元、一個名稱和一個第二個 % 字元組成,除非名稱是 0 ... 9 中的數字或星號 *。

變數說明用以下值替換

  • varname%,例如%PATH%或%USERNAME%,用命名環境變數的值替換。例如,%PATH%用 PATH 環境變數的值替換。變數名稱匹配不區分大小寫:%PATH%和%path%具有相同的效果。
  • n 對於 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 之間。另見#Calculation.
%ERRORLEVEL% 最後一個執行的命令或最後一個呼叫的批處理指令碼返回的錯誤級別。另見#Error level.
%CMDEXTVERSION% cmd.exe 當前使用的命令處理器擴充套件的版本號。
%CMDCMDLINE% 啟動當前 cmd.exe 時使用的命令列內容。

連結

引用和轉義

[編輯 | 編輯原始碼]

您可以阻止控制命令語法的特殊字元具有它們的特殊含義,方法如下,但百分號(%)除外

  • 您可以用引號包圍包含特殊字元的字串。
  • 您可以在特殊字元之前立即放置插入符號(^),這是一個跳脫字元。在管道(|)之後的命令中,您需要使用三個插入符號(^^^)才能使其工作。

需要引用或轉義的特殊字元通常是 <、>、|、& 和 ^。在某些情況下,!和 \ 可能需要轉義。可以使用插入符號轉義換行符。

當您使用引號包圍字串時,它們將成為傳遞給呼叫的命令的引數的一部分。相反,當您使用插入符號作為跳脫字元時,插入符號不會成為傳遞的引數的一部分。

百分號(%)是一個特例。在命令列中,它不需要引用或轉義,除非使用兩個百分號表示變數,例如%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 不知道。

連結

根據語法,將命令列開發成一系列命令。在該語法中,簡單命令可以組合形成管道管道又可以組合形成複合命令,最後可以變成帶括號的命令

簡單命令只是一個命令名稱、一個命令尾和一些重定向說明。簡單命令的示例是dir *.txt > somefile.

管道是幾個簡單命令用“管道”元字元“|”連線在一起,也稱為“豎線”。每個豎線之前的簡單命令的標準輸出連線到它後面的簡單命令的標準輸入,透過管道。命令直譯器並行執行管道中的所有簡單命令。管道(包含兩個簡單命令)的示例是dir *.txt | more.

複合命令是一組由連線符分隔的管道。這些管道按順序執行,一個接一個,連線符控制命令直譯器是否執行下一個管道。複合命令的示例(包含兩個管道,管道本身只是簡單命令)是move file.txt file.bak && dir > file.txt.

連線符

  • & - 無條件連線符。下一個管道將在當前管道完成執行後始終執行。
  • && - 正向條件連線符。如果當前管道以零退出狀態完成執行,則執行下一個管道。
  • || - 負向條件連線符。如果當前管道以非零退出狀態完成執行,則執行下一個管道。

帶括號的命令是包含在括號中的複合命令(即())。從語法的角度來看,這將複合命令轉換為簡單命令,其整體輸出可以重定向。

例如:命令列( pushd temp & dir & popd ) > somefile導致整個複合命令的標準輸出( pushd temp & dir & popd )被重定向到somefile

連結

重定向

[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]

命令直譯器程序的環境變數被其執行的任何(外部)命令的程序繼承。命令直譯器本身使用了一些環境變數。更改它們會改變其操作。

環境變數受 SETPATHPROMPT 命令的影響。

要取消設定變數,請將其設定為空字串,例如“set myvar=”。

命令直譯器從建立它的程序繼承其初始的環境變數集。例如,對於從桌面快捷方式呼叫的命令直譯器,這將是 Windows 資源管理器。

命令直譯器通常具有文字使用者介面,而不是圖形使用者介面,因此無法識別通知應用程式登錄檔中的環境變數模板已更改的 Windows 訊息。在控制面板中更改環境變數將導致 Windows 資源管理器從登錄檔中的模板更新其自身的環境變數,從而更改任何隨後呼叫的命令直譯器將繼承的環境變數。但是,它不會導致正在執行的命令直譯器從登錄檔中的模板更新其環境變數。

也可以參考 #變數替換

連結

COMSPEC

[edit | edit source]

COMSPEC 環境變數包含命令直譯器程式檔案的完整路徑名。這只是從父程序繼承的,因此間接地從登錄檔中環境變數模板中 COMSPEC 的設定派生而來。

PATH 環境變數的值包含一個目錄名列表,用分號字元隔開。這是在查詢要執行的外部命令的程式檔案時按順序搜尋的目錄列表。

PATHEXT

[edit | edit source]

PATHEXT 環境變數的值是用分號 (";") 分隔的檔名副檔名列表。這是在查詢要執行的外部命令的程式檔案時按順序應用的檔名副檔名列表。

"echo %PATHEXT%" 列印的 PATHEXT 的示例內容

  • .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC

透過將“.PL”新增到變數中,您可以確保即使在沒有“.pl”副檔名的情況下鍵入,Perl 程式也能從命令列執行。因此,您可以鍵入“mydiff a.txt b.txt”而不是鍵入“mydiff.pl a.txt b.txt”。

在 Windows Vista 及更高版本中將“.PL”新增到變數中

  • setx PATHEXT %PATHEXT%;.PL
    • 如果您使用 Windows XP 中可用的“set”,則效果將是臨時的,並且只會影響當前控制檯或程序。

連結

PROMPT

[edit | edit source]

PROMPT 環境變數控制命令直譯器顯示提示時發出的文字。命令直譯器在互動模式下提示輸入新命令列時或在批處理檔案模式下回顯批處理檔案行時顯示提示。

PROMPT 環境變數的值中的各種特殊字元序列在顯示提示時會導致各種特殊效果,如以下表格所示

字元 擴充套件結果
$$ $ 字元本身
$A & 符號,也稱為與號。這是一個便利的符號,因為使用 SET 命令很難在 PROMPT 環境變數的值中放置一個字面上的&
$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。

錯誤級別的用途

  • 可以使用 && 和 || 進行測試;另請參見 #語法
  • 可以使用 IF 進行測試。
  • 可以使用 ERRORLEVEL 變數訪問該值。

示例

  • dir >NUL && echo Success
    • 只有當錯誤級別為零時,才會執行 && 後面的部分。
  • color 00 || echo Failure
    • 只有當錯誤級別為非零時,無論是正數還是負數,才會執行 || 後面的部分。
  • color 00 || (
      echo Failure
    )
    • 多行括號也可以正常工作。
  • echo %ERRORLEVEL%
    • 輸出錯誤級別,而不更改它。
  • if %errorlevel% equ 0 echo The error level is zero, meaning success.
  • if %errorlevel% neq 0 echo The error level is non-zero, meaning failure.
  • if errorlevel 1 echo The error level is >= 1, meaning failure via positive error level.
    • 不涵蓋透過負錯誤級別發生的失敗。請注意“>=”部分:這與 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" 測試,它似乎是測試成功,但在負數上透過:它測試的是“非 errorlevel >= 1”,也就是“errorlevel <= 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
)

這看起來很優雅,但並不穩健,它會錯誤地處理包含萬用字元 (*, ?) 的引數。特別是,上面的命令將包含萬用字元 (*, ?) 的引數替換為與它們匹配的檔名,或者如果沒有任何檔案匹配,則刪除它們。儘管如此,只要傳遞的引數不包含萬用字元,上面的迴圈就可以按預期工作。

以非穩健的方式查詢命令列引數的數量

set argcount=0
for %%i in (%*) do set /a argcount+=1

同樣,這對包含萬用字元的引數不起作用。

在 Windows Vista 機器上,根據經驗確定,最大可能的引數數量大於 4000。在 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
    • 遞迴列出目錄內容,顯示完整路徑。

連結

萬用字元

[編輯 | 編輯原始碼]

許多命令接受檔名萬用字元 - 不代表自身的字元,可以匹配一組檔名。

萬用字元

  • *(星號):任意字元序列
  • ?(問號):單個字元,不包括句點("."),或者,如果它是檔名最大無句點部分末尾的一系列問號的一部分,則可能為零個字元;請參閱示例以瞭解說明

示例

  • 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" 部分將被替換為當前資料夾中找到的檔名,忽略巢狀資料夾。

接受萬用字元的命令包括 ATTRIBCOPYDIRFINDSTRFORREN 等。

連結

使用者輸入

[編輯 | 編輯原始碼]

您可以使用以下方法從使用者那裡獲取輸入

  • SET /P 命令
  • CHOICE 命令
  • 使用 "type con >myfile.txt",使用者按下 Control + Z 終止多行使用者輸入。

百分號波浪線

[編輯 | 編輯原始碼]

命令列引數 包含檔名時,可以使用特殊語法來獲取有關該檔案的各種資訊。

以下語法擴充套件到有關作為 %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 /?"。

連結

函式又稱子程式,可以使用 CALL、標籤、SETLOCALENDLOCAL 來模擬。

確定算術冪的函式示例

@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

(請參閱 命令列引數 以作提醒)

連結

批處理指令碼可以使用 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"。類似地,對於 *=、/=、 %=、&=、^=、|=、<<= 和 >>=。

支援運算子的優先順序順序如下

  1. ( )
  2. * / % + -
  3. << >>
  4. &
  5. ^
  6. |
  7. = *= /= %= += -= &= ^= |= <<= >>=
  8. ,

文字可以輸入為十進位制 (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"
    • 由於 ">>" 運算子是算術右移,它保留了 32 位有符號整數的底層位表示中的最高位,因此輸出 -1 作為結果。注意,-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

連結

查詢檔案

[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 中的語法,請參見 #百分號波浪線
  • 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 命令列時(在按下 Windows + R 後鍵入 cmd.exe 後出現),可以使用多個鍵盤快捷鍵,包括功能鍵

  • 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:開啟一個基於字元的彈出視窗,顯示命令歷史記錄,並允許您使用箭頭鍵和回車鍵選擇命令。 在彈出視窗中按回車鍵後,命令立即執行。
  • 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 上成功。 使用正斜槓。

連結

陣列

[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

連結

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 命令,顯示該行的第二個欄位或列,在本例中為 b。 使用 $F[2] 顯示第三個欄位;索引從零開始。 本機解決方案:FOR /f。
  • perl -ne "print if /\x22hello\x22/" file.txt
    • 充當 grep 或 FINDSTR,輸出 file.txt 中與 if 後的正則表示式匹配的行。 使用強大的 Perl 正則表示式,比 FINDSTR 的正則表示式更強大。
  • 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 進行調整。

連結

Unix 命令

[edit | edit source]

Windows cmd.exe 命令直譯器可以使用來自類 Unix 作業系統的命令,前提是這些命令已安裝。 示例命令包括 grep、sed、awk、wc、head 和 tail。 這些命令來自 GNU 專案,並且存在它們的 Windows 移植版本。 您可以在 Unix 指南 華夏公益教科書中瞭解更多關於這些命令的資訊。 注意,依賴於這些命令的批處理程式不能保證在其他 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+,,

連結

獲取最後幾行

[edit | edit source]

沒有內建命令來獲取檔案的最後幾行;沒有 tail 命令的等效項。 但是,可以編寫一個批處理程式來完成這項工作,並且可以從下面的連結中獲得。 或者,可以為 Windows 安裝 tail 命令,或者執行不需要安裝的 PowerShell 等效命令。

連結

十六進位制轉儲

[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) 安裝一個命令,例如功能豐富的odhexdump;請參閱 Unix 命令od 也可以進行八進位制轉儲。

5) 如果您使用的是舊的 32 位版本的 Windows(不太可能),請使用debug;請參閱 DEBUG

連結

以提升許可權執行

[編輯 | 編輯原始碼]

如果您的使用者擁有提升的管理許可權,您可以透過特定方式啟動 cmd.exe 來使用這些許可權。要以提升許可權啟動 cmd.exe,您可以執行以下操作。

  • 選擇“開始”選單並在其中鍵入“cmd.exe”。
  • 右鍵單擊 cmd.exe 圖示並選擇“以管理員身份執行”。

要測試您是否具有提升許可權

  • 執行“net session”,如果您沒有許可權,則會失敗。

侷限性

[編輯 | 編輯原始碼]

限制包括以下內容

  • 沒有 while 迴圈;可以透過標籤和 goto 來模擬。有一個 for 迴圈和一個 if 語句。
  • 沒有從 C 語言中知道的用於迴圈控制的 break 和 continue 語句。
  • 沒有真正的自定義函式;可以使用標籤、呼叫和 %n 引數擴充套件來建立自定義函式。
  • 對包含特殊字元(如引號 (") 或 & 號)的字串的脆弱處理。
  • 沒有陣列;可以有限地模擬。
  • 沒有關聯陣列,也稱為字典。
  • 沒有浮點運算。
  • 沒有來自 C 語言的三元條件運算子。
  • 沒有將字元轉換為其 ASCII 值或將 ASCII 值轉換為字元的函式。沒有合理的變通方法。
  • 沒有任意大的整數運算。
  • 沒有來自其他作業系統的更改檔案時間戳的 touch 命令;沒有 head 和 tail 命令。
  • 沒有 GUI 程式設計。
  • 等等。

內建命令

[編輯 | 編輯原始碼]

這些命令都內置於命令直譯器本身,無法更改。有時這是因為它們需要訪問內部命令直譯器資料結構,或修改命令直譯器程序本身的屬性。

命令 描述
ASSOC 將副檔名與檔案型別(FTYPE)關聯。
BREAK 設定或清除擴充套件 CTRL+C 檢查。
CALL 從另一個批處理程式呼叫一個批處理程式。
CDCHDIR 輸出或設定當前目錄。
CHCP 輸出或設定活動內碼表號。
CLS 清除螢幕。
COLOR 設定控制檯前景色和背景色。
COPY 複製檔案。
DATE 輸出並設定系統日期。
DELERASE 刪除一個或多個檔案。
DIR 輸出目錄中檔案和子目錄的列表。
ECHO 輸出訊息,或開啟或關閉命令回顯。
ELSE 當“IF”不為真時,在批處理程式中執行條件處理。
ENDLOCAL 結束批處理檔案中的環境更改本地化。
EXIT 退出 CMD.EXE 程式(命令直譯器)。
FOR 對一組檔案中的每個檔案執行指定的命令。
FTYPE 設定檔案型別命令。
GOTO 轉到標籤。
IF 在批處理程式中執行條件處理。
MDMKDIR 建立目錄。
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 的預期用法,而且沒有正式記錄。

另請參見 函式CMDSTART

連結

更改到不同的目錄,或輸出當前目錄。但是,如果使用不同的驅動器號,它不會切換到該不同的驅動器或卷。

示例

  • 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
    • 恢復原始顏色設定。

連結

複製檔案。另請參見 MOVEXCOPYROBOCOPY

示例

  • 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 之前的 @ 中刪除 @。
  • 如果您安裝了 Perl
    • for /f %i in ('perl -MPOSIX -le "print strftime '%Y-%m-%d', localtime"') do @set isodate=%i

連結

輸出訊息,或開啟或關閉命令回顯。

示例

  • 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
    • 回顯即使是較小的數字(在本例中為 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
  • 退出 /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 中的語法,請參見 #百分號波浪線

/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
    • 將字串解析為以“:”分隔的標記。
    • 引號表示該字串不是檔名。
    • 即使 %b 和 %c 在“do”之前的命令部分中沒有明確提及,第二個和第三個標記也會儲存在 %b 和 %c 中。
    • 兩個連續的冒號被視為一個分隔符;%c 不是 "",而是 "Third"。
    • 完成其他作業系統中 cut 命令的一些工作。
  • for /f "tokens=1-3* delims=:" %a in ("First:Second::Third:Fourth:Fifth") do @echo %c-%b-%a: %d
    • 如上所述,只是第 4 個和第 5 個專案被捕獲在 %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
)

連結

輸出或設定要為檔案型別執行的命令。另請參見 ASSOC

示例

  • ftype
    • 列出所有與檔案型別關聯的命令,例如,'Perl="C:\Perl\bin\perl.exe" "%1" %*'。
  • ftype | find "Excel.Sheet"
    • 僅列出顯示行包含 "Excel.Sheet" 的關聯。

連結

轉到標籤。

一個例子

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 忘記迴圈,即使標籤在同一個迴圈體內也是如此。

連結

有條件地執行命令。在 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

連結

建立新的目錄或目錄。有一個同義詞 MKDIR;另請參見它的反義詞 RD

示例

  • md Dir
    • 在當前目錄中建立一個目錄。
  • md Dir1 Dir2
    • 在當前目錄中建立兩個目錄。
  • md "My Dir With Spaces"
    • 在當前目錄中建立一個包含空格的目錄。

連結

MD 的同義詞。

建立符號連結或其他型別的連結。從 Windows Vista 開始可用。

連結

在目錄之間移動檔案或目錄,或重新命名它們。另請參見 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 環境變數的值。在輸出時,在輸出的開頭包含“PATH=”。

示例

  • path
    • 輸出 PATH。示例輸出
      • PATH=C:\Windows\system32;C:\Windows;C:\Program Files\Python27
  • path C:\Users\Joe Hoe\Scripts;%path%
    • 將 C:\Users\Joe Hoe\Scripts 擴充套件到路徑,僅適用於 cmd.exe 的程序。
  • path ;
    • 清空路徑。
  • echo %path% | perl -pe "s/;/\n/g" | sort
    • 如果你安裝了 perl,則顯示路徑中的資料夾(已排序)。

連結

提示使用者並等待輸入一行。

連結

更改到從目錄堆疊中彈出的驅動器和目錄。目錄堆疊使用 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

連結

這是 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 迴圈中使用的序列。雙冒號似乎只是一個技巧,一個以冒號開頭的標籤。

連結

這是 RD 的同義詞。

輸出或設定環境變數。使用 /P 開關時,它會詢問使用者輸入,並將結果儲存在變數中。使用 /A 開關時,它會執行簡單的算術計算,並將結果儲存在變數中。對於字串賦值,通常會避免等號前後有空格,因為這會導致通常意想不到的結果:“set name = Peter”分配給變數“name ”,而“set name=Peter”分配給變數“name”。另請參見 #環境變數#計算

示例

  • set
    • 輸出環境變數列表及其值,格式為 VAR=VALUE,每行一個變數。
  • set home
    • 輸出以“home”開頭的變數的環境變數列表及其值,不區分大小寫,格式為 VAR=VALUE,每行一個變數。
  • 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 )
    • 用計算結果設定 result 變數。另請參見 #計算
  • 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

連結

SHIFT

[edit | edit source]

將批處理檔案引數沿其移動,但不影響 %*。 因此,如果 %1=Hello 1,%2=Hello 2,%3=Hello 3,則在 SHIFT 後,%1=Hello 2,%2=Hello 3,但 %* 為“Hello 1” “Hello 2” “Hello 3”。

連結

START

[edit | edit source]

在新視窗中啟動程式或開啟文件。 使用不明確的演算法來確定第一個傳遞的引數是視窗標題還是要執行的程式; 假設:它使用第一個引數周圍引號的存在作為它是一個視窗標題的提示。

示例

  • 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 命令的控制檯。

連結

輸出或設定系統時間。 另請參見 #DATE#特殊變數名稱 中的 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 filename.txt
  • type a.txt b.txt
  • type *.txt
  • type NUL > tmp.txt
    • 建立一個空檔案(空白檔案)。

連結

顯示命令處理器或作業系統版本。

C:\>VER

Microsoft Windows XP [Version 5.1.2600]

C:\>

一些版本字串

  • Microsoft Windows [版本 5.1.2600]
    • 適用於 Windows XP
  • Microsoft Windows [版本 6.0.6000]
    • 適用於 Windows Vista
  • ...

“版本”一詞已本地化。

連結

VERIFY

[edit | edit source]

設定或清除設定,以驗證是否正確寫入 COPY 檔案等。

連結

輸出卷標。

連結

外部命令

[edit | edit source]

Windows 命令直譯器可用的外部命令是單獨的可執行程式檔案,由 Microsoft 與作業系統一起提供,或者作為第三方命令直譯器的標準捆綁提供。 透過替換程式檔案,可以更改這些命令的含義和功能。

許多(但並非所有)外部命令支援“/?”約定,導致它們將線上使用資訊寫入其標準輸出,然後以狀態程式碼 0 退出。

輸出或更改地址解析協議快取中的專案,該快取將 IP 地址對映到物理地址。

連結

安排程式在特定時間執行。 另請參見 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 /?”。

連結

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 捲上的資料夾。

連結

(XP 中沒有,或者從 Server 2003 製作副本) 將管道輸入放置到剪貼簿。

示例

  • set | clip
    • 將環境變數列表放置到剪貼簿。
  • clip < File1.txt
    • 將 File1.txt 的內容放置到剪貼簿。

連結

呼叫另一個 Microsoft CMD 例項。

連結

比較檔案。另請參見 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 中,可用作快速檢視檔案十六進位制內容的駭客工具。關鍵詞:十六進位制轉儲、十六進位制轉儲、十六進位制轉儲、檢視十六進位制、檢視十六進位制、反彙編程式。

Debug 提供自己的命令列。在命令列上,鍵入“?”以查詢有關除錯命令的資訊。

要檢視檔案的十六進位制,請使用檔名作為引數呼叫 debug.exe,然後在除錯命令列上反覆鍵入“d”並按回車。

侷限性

  • 作為 DOS 程式,debug 會對長檔名產生問題。使用 dir /x 查詢 8.3 檔名,然後對該檔名應用除錯。
  • 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 File1.txt File2.txt >NUL && Echo Same || echo Different or error
    • 使用 fc 的錯誤級別檢測差異。錯誤級別為零表示檔案相同;非零可能表示檔案不同,也可能表示其中一個檔案不存在。

連結

在檔案或輸入中搜索字串,輸出匹配的行。與 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]*$" 匹配的行進行搜尋。
  • 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
    • 不僅適用於文字檔案,還適用於二進位制檔案。

"findstr" 的正則表示式限制,與 "grep" 相比

  • 不支援組 - “\(","\)”。
  • 不支援貪婪迭代器 - "*?"。
  • 不支援 "前一個的零個或一個" - "?"。
  • 等等。

其他限制:存在各種限制和奇怪的行為,如 Windows FINDSTR 命令的未公開功能和限制 中所述。

錯誤

  • echo bb|findstr "bb baaaa"
    • 在多個 Windows 版本中沒有找到任何內容,但它應該找到。

還可以考慮鍵入 "findstr /?"。

連結

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 /?

格式化磁碟以使用 Windows 支援的檔案系統(如 FAT、FAT32 或 NTFS),從而覆蓋磁碟上的先前內容。 使用時要格外小心。

連結

一個功能強大的工具,執行與 FAT 和 NTFS 檔案系統相關的操作,理想情況下僅供擁有廣泛作業系統知識的高階使用者使用。

連結

輸出使用者或計算機的組策略設定等資訊。

連結

在圖形模式下啟用擴充套件字元集的顯示。 更多資訊,請鍵入“graftabl /?”。

連結

顯示命令幫助。

示例

  • help
    • 顯示 Windows 提供的命令列表。
  • help copy
    • 顯示 COPY 命令的幫助資訊,也可以透過鍵入“copy /?”獲得。

連結

(XP 中沒有)顯示或更改檔案或資料夾的任意訪問控制列表 (DACL)。 另請參閱CACLS。 更多資訊,請鍵入“icacls /?”。

連結

輸出 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 沒有任何作用; 它出於相容性原因存在。

連結

提供各種網路服務,具體取決於所使用的命令。 每個命令的可用變體

  • 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

連結

OPENFILES

[編輯 | 編輯原始碼]

執行與開啟的檔案相關的操作,尤其是其他使用者透過網路開啟的檔案。 這些操作包括查詢、顯示和斷開連線。 更多資訊,請鍵入“openfiles /?”。

連結

語法

  • PING /?
  • PING 地址
  • PING 主機名

透過網路向指定地址(或透過名稱查詢對映到的指定主機名的第一個 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 中沒有) 複製檔案和資料夾。另請參見 XCOPYCOPY

示例

  • robocopy /s C:\Windows\system C:\Windows-2\system *.dll
    • 將以 .dll 結尾的所有檔案從一個目錄複製到另一個目錄,複製巢狀目錄結構。

連結

執行 DLL 中可用的函式。可用的 DLL 及其函式在不同 Windows 版本中有所不同。

示例

  • rundll32 sysdm.cpl,EditEnvironmentVariables
    • 在某些 Windows 版本中,開啟編輯環境變數的對話方塊。

連結

控制 Windows 服務,支援啟動、停止、查詢等操作。Windows 服務類似於程序。Windows 服務要麼在其自身程序中託管,要麼託管在 svchost.exe 程序的例項中,通常同一個例項中有多個服務。可以透過使用 Sysinternals 提供的免費下載的 Process Explorer,轉到服務的屬性,然後檢視“執行緒”選項卡,找到特定服務的處理器時間使用情況。另一個可以控制服務的命令是 NET。使用 /svc 開關,TASKLIST 可以列出託管的服務。

示例

  • sc start wuauserv
    • 啟動 wuauserv 服務。
  • sc stop wuauserv
  • sc query wuauserv
  • sc query
    • 輸出有關所有服務的資訊。
  • sc config SysMain start= disabled
    • 確保啟動後 SysMain 服務已停用。SysMain 是 SuperFetch 服務,透過嘗試猜測哪些程式將在使用時載入到 RAM 中並將其載入,從而導致反覆的硬碟驅動器活動。請注意,等號前後的空格必須分別為 0 個和 1 個。

連結

安排程式在特定時間執行,比 AT 更強大。

連結

SET 相似,但會影響整個計算機,而不是當前控制檯或程序。Windows XP 中不可用;Windows Vista 及更高版本中可用。

連結

關閉計算機或登出當前使用者。

示例

  • shutdown /s
    • 關閉計算機。
  • shutdown /s /t 0
    • 立即關閉計算機。
  • shutdown /l
    • 登出當前使用者。

連結

按字母順序排序,從 A 到 Z 或 Z 到 A,不區分大小寫。無法按數字順序排序:如果輸入包含每行一個整數,“12” 在“9” 之前。

示例

  • sort File.txt
    • 輸出 File.txt 的排序內容。
  • sort /r File.txt
    • 按反序排序,從 Z 到 A。
  • dir /b | sort

連結

將驅動器號分配給本地資料夾,輸出當前分配或刪除分配。

示例

  • subst p: .
    • 將 p: 分配給當前資料夾。
  • subst
    • 輸出之前使用 subst 做出的所有分配。
  • subst /d p
    • 刪除 p: 分配。

連結

SYSTEMINFO

[編輯 | 編輯原始碼]

顯示計算機及其作業系統的配置。

連結

結束一個或多個任務。

示例

  • 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。

連結

列出任務,包括任務名稱和程序 ID (PID)。

示例

  • tasklist | sort
  • tasklist | find "AcroRd"
  • tasklist | find /C "chrome.exe"
    • 輸出名為“chrome.exe”的任務數量,這些任務屬於 Google Chrome 瀏覽器。
  • tasklist /svc | findstr svchost
    • 輸出託管在 svchost.exe 程序中的 Windows 服務,以及有關程序的通常資訊。

連結

等待指定的秒數,顯示剩餘的秒數,允許使用者透過按一個鍵中斷等待。也稱為延遲或睡眠。Windows Vista 及更高版本中可用。

示例

  • timeout /t 5
    • 等待五秒鐘,允許使用者透過按一個鍵取消等待。
  • timeout /t 5 /nobreak
    • 等待五秒鐘,忽略使用者輸入,除非是 Control + C。
  • timeout /t 5 /nobreak >nul
    • 與上面相同,但不輸出任何內容。

Windows XP 中的解決方法

  • ping -n 6 127.0.0.1 >nul
    • 等待五秒鐘; -n 後面的數字是等待秒數加 1。

基於 Perl 的 Windows XP 解決方法,需要安裝 Perl

  • perl -e "sleep 5"
    • 等待 5 秒。

連結

將當前目錄的所有子目錄的樹輸出到任何遞迴級別或深度。如果與 /F 開關一起使用,則不僅輸出子目錄,還輸出檔案。

示例

  • tree /f
    • 除了目錄之外,還包括列表中的檔案。
  • tree /f /a
    • 如上所述,但使用 7 位 ASCII 字元,包括 "+"、"-" 和 "\" 來繪製樹。

使用 8 位 ASCII 字元的樹的片段

├───winevt
│   ├───Logs
│   └───TraceFormat
├───winrm

使用 7 位 ASCII 字元的樹的片段

+---winevt
|   +---Logs
|   \---TraceFormat
+---winrm

連結

在哪裡

[編輯 | 編輯原始碼]

輸出檔案或檔名模式的一個或多個位置,其中檔案或模式不需要指定副檔名,如果它在 PATHEXT 中列出,例如 .exe。預設情況下,在當前目錄和 PATH 中搜索。在一定程度上完成了某些其他作業系統的 "which" 命令的工作,但更靈活。

適用於 Windows 2003、Windows Vista、Windows 7 及更高版本;不適用於 Windows XP。下面示例中提供了可用於 Windows XP 的替代方案。

找不到內部命令,因為沒有與它們匹配的點 exe 檔案。

示例

  • where find
    • 輸出 find 命令的位置,可能是 "C:\Windows\System32\find.exe"。只要 .exe 副檔名在 PATHEXT 中列出,就不需要指定 .exe 副檔名,預設情況下它在 PATHEXT 中列出。
    • 如果路徑中存在多個 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 中。除了 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
[編輯 | 編輯原始碼]
華夏公益教科書