批處理指令碼 - 快速指南



批處理指令碼 - 概述

批處理指令碼用於自動化重複性命令序列。指令碼編寫是一種方法,可以透過自動化這些命令序列來簡化 shell 操作,提高生產力。在大多陣列織中,批處理指令碼都以某種方式用於自動化任務。

批處理指令碼的一些特性包括:

  • 可以讀取使用者的輸入,以便進一步處理。

  • 具有 for、if、while、switch 等控制結構,以便更好地進行自動化和指令碼編寫。

  • 支援函式和陣列等高階特性。

  • 支援正則表示式。

  • 可以包含其他程式設計程式碼,例如 Perl。

批處理指令碼的一些常見用途包括:

  • 為不同目的設定伺服器。

  • 自動化日常維護活動,例如刪除不需要的檔案或日誌檔案。

  • 自動化應用程式從一個環境到另一個環境的部署。

  • 一次在多臺機器上安裝程式。

批處理指令碼儲存在簡單的文字檔案中,其中包含按順序執行的命令列。這些檔案具有特殊的副檔名 BAT 或 CMD。此類檔案透過命令直譯器(系統檔案,有時稱為 shell)提供的介面識別和執行。在 Windows 系統上,此直譯器稱為 cmd.exe。

執行批處理檔案只需單擊它即可。批處理檔案也可以在命令提示符或“開始-執行”行中執行。在這種情況下,必須使用完整路徑名,除非檔案路徑位於路徑環境變數中。以下是一個簡單的批處理指令碼示例。執行此批處理指令碼將刪除當前目錄中的所有檔案。

:: Deletes All files in the Current Directory With Prompts and Warnings
::(Hidden, System, and Read-Only Files are Not Affected)
:: @ECHO OFF
DEL . DR

批處理指令碼 - 環境

本章解釋與批處理指令碼相關的環境。

編寫和執行

通常,可以使用記事本來建立批處理檔案。這是建立批處理檔案的簡便工具。接下來是批處理指令碼的執行環境。在 Windows 系統上,這是透過命令提示符或 cmd.exe 完成的。所有批處理檔案都在此環境中執行。

以下是啟動 cmd.exe 的不同方法:

方法 1 - 轉到 C:\Windows\System32 並雙擊 cmd 檔案。

Writing Executing Method1

方法 2 - 透過執行命令 – 以下快照顯示了在 Windows Server 2012 上查詢命令提示符 (cmd.exe) 的方法。

Writing Executing Method2

啟動 cmd.exe 後,您將看到以下螢幕。這將是您執行批處理指令碼的環境。

Batch Scripting Environment

環境變數

為了從命令提示符執行批處理檔案,您需要轉到儲存批處理檔案的位置,或者您可以在路徑環境變數中輸入檔案位置。因此,假設批處理檔案儲存在 `C:\Application\bin` 位置,您需要按照以下說明包含 PATH 變數。

作業系統 輸出
Windows 將字串 `C:\Application\bin` 附加到系統變數 PATH 的末尾。

批處理指令碼 - 命令

在本章中,我們將瞭解一些常用的批處理命令。

序號 命令和描述
1 VER

此批處理命令顯示您正在使用的 MS-DOS 版本。

2 ASSOC

這是一個批處理命令,用於將副檔名與檔案型別 (FTYPE) 關聯,顯示現有關聯或刪除關聯。

3 CD

此批處理命令有助於更改到不同的目錄或顯示當前目錄。

4 CLS

此批處理命令清除螢幕。

5 COPY

此批處理命令用於將檔案從一個位置複製到另一個位置。

6 DEL

此批處理命令刪除檔案,而不是目錄。

7 DIR

此批處理命令列出目錄的內容。

8 DATE

此批處理命令有助於查詢系統日期。

9 ECHO

此批處理命令顯示訊息或開啟或關閉命令回顯。

10 EXIT

此批處理命令退出 DOS 控制檯。

11 MD

此批處理命令在當前位置建立一個新目錄。

12 MOVE

此批處理命令在目錄之間移動檔案或目錄。

13 PATH

此批處理命令顯示或設定路徑變數。

14 PAUSE

此批處理命令提示使用者並等待輸入一行。

15 PROMPT

此批處理命令可用於更改或重置 cmd.exe 提示符。

16 RD

此批處理命令刪除目錄,但必須先清空目錄才能刪除。

17 REN

重新命名檔案和目錄

18 REM

此批處理命令用於批處理檔案中的備註,防止執行備註的內容。

19 START

此批處理命令在新視窗中啟動程式或開啟文件。

20 TIME

此批處理命令設定或顯示時間。

21 TYPE

此批處理命令將檔案內容列印到輸出。

22 VOL

此批處理命令顯示卷標。

23 ATTRIB

顯示或設定當前目錄中檔案的屬性

24 CHKDSK

此批處理命令檢查磁碟是否存在任何問題。

25 CHOICE

此批處理命令向用戶提供一系列選項。

26 CMD

此批處理命令呼叫另一個命令提示符例項。

27 COMP

此批處理命令根據檔案大小比較兩個檔案。

28 CONVERT

此批處理命令將卷從 FAT16 或 FAT32 檔案系統轉換為 NTFS 檔案系統。

29 DRIVERQUERY

此批處理命令顯示所有已安裝的裝置驅動程式及其屬性。

30 EXPAND

此批處理命令從壓縮的 .cab 壓縮包檔案中提取檔案。

31 FIND

此批處理命令搜尋檔案或輸入中的字串,輸出匹配的行。

32 FORMAT

此批處理命令格式化磁碟以使用 Windows 支援的檔案系統(如 FAT、FAT32 或 NTFS),從而覆蓋磁碟上的先前內容。

33 HELP

此批處理命令顯示 Windows 提供的命令列表。

34 IPCONFIG

此批處理命令顯示 Windows IP 配置。按連線顯示配置和該連線的名稱。

35 LABEL

此批處理命令新增、設定或刪除磁碟卷標。

36 MORE

此批處理命令一次顯示一個螢幕的檔案內容。

37 NET

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

38 PING

此批處理命令透過網路向指定地址傳送 ICMP/IP“回顯”資料包。

39 SHUTDOWN

此批處理命令關閉計算機或登出當前使用者。

40 SORT

此批處理命令從原始檔獲取輸入,並按字母順序(從 A 到 Z 或從 Z 到 A)對其內容進行排序。它在控制檯上列印輸出。

41 SUBST

此批處理命令將驅動器號分配給本地資料夾,顯示當前分配或刪除分配。

42 SYSTEMINFO

此批處理命令顯示計算機及其作業系統的配置。

43 TASKKILL

此批處理命令結束一個或多個任務。

44 TASKLIST

此批處理命令列出任務,包括任務名稱和程序 ID (PID)。

45 XCOPY

此批處理命令以更高階的方式複製檔案和目錄。

46 TREE

此批處理命令顯示當前目錄的所有子目錄的樹狀結構,直到任何級別的遞迴或深度。

47 FC

此批處理命令列出兩個檔案之間的實際差異。

48 DISKPART

此批處理命令顯示和配置磁碟分割槽的屬性。

49 TITLE

此批處理命令設定在控制檯視窗中顯示的標題。

50 SET

顯示當前系統上的環境變數列表。

批處理指令碼 - 檔案

在本章中,我們將學習如何建立、儲存、執行和修改批處理檔案。

建立批處理檔案

批處理檔案通常在記事本中建立。因此,最簡單的方法是開啟記事本並輸入指令碼所需的命令。對於此練習,請開啟記事本並輸入以下語句。

:: Deletes All files in the Current Directory With Prompts and Warnings 
::(Hidden, System, and Read-Only Files are Not Affected) 
:: 
@ECHO OFF 
DEL . 
DR

儲存批處理檔案

建立批處理檔案後,下一步是儲存批處理檔案。批處理檔案的副檔名為 .bat 或 .cmd。命名批處理檔案時,請記住以下一些一般規則:

  • 命名批處理檔案時,儘量避免使用空格,因為有時從其他指令碼呼叫它們時會產生問題。

  • 不要使用系統中已有的常用批處理檔名,例如 ping.cmd。

Saving Batch Files

上面的截圖顯示瞭如何儲存批處理檔案。儲存批處理檔案時,請記住以下幾點。

  • 記得在檔名末尾加上 .bat 或 .cmd。
  • 選擇“儲存型別”選項為“所有檔案”。
  • 將整個檔名用引號“”括起來。

執行批處理檔案

執行批處理檔案的步驟如下:

  • 步驟 1 − 開啟命令提示符 (cmd.exe)。

  • 步驟 2 − 轉到儲存 .bat 或 .cmd 檔案的位置。

  • 步驟 3 − 編寫如下圖所示的檔名,然後按 Enter 鍵執行批處理檔案。

Executing Batch Files

修改批處理檔案

修改現有批處理檔案的步驟如下:

  • 步驟 1 − 開啟 Windows 資源管理器。

  • 步驟 2 − 轉到儲存 .bat 或 .cmd 檔案的位置。

  • 步驟 3 − 右鍵單擊該檔案,然後從上下文選單中選擇“編輯”選項。該檔案將在記事本中開啟,以便進一步編輯。

Modifying Batch Files

批處理指令碼 - 語法

通常,批處理檔案的第一行通常包含以下命令。

ECHO 命令

@echo off

預設情況下,批處理檔案會在執行時顯示其命令。第一條命令的目的是關閉此顯示。“echo off”命令關閉整個指令碼的顯示,但“echo off”命令本身除外。“@”符號在前面使命令也應用於自身。

文件

批處理檔案經常包含以“Rem”命令開頭的行。這是一種輸入註釋和文件的方法。計算機忽略 Rem 後一行上的任何內容。對於複雜性越來越高的批處理檔案,這通常是一個好主意。

第一個批處理指令碼程式

讓我們構建我們簡單的第一個批處理指令碼程式。開啟記事本並輸入以下程式碼行。將檔案儲存為“List.cmd”。

程式碼執行以下操作:

  • 使用 echo off 命令確保在執行程式碼時不顯示命令。

  • Rem 命令用於添加註釋以說明此批處理檔案的確切用途。

  • dir 命令用於獲取 C:\Program Files 位置的內容。

  • “>”命令用於將輸出重定向到檔案 C:\lists.txt。

  • 最後,echo 命令用於告訴使用者操作已完成。

@echo off 
Rem This is for listing down all the files in the directory Program files 
dir "C:\Program Files" > C:\lists.txt 
echo "The program has completed"

執行上述命令時,C:\Program Files 中的檔名將傳送到檔案 C:\Lists.txt,並且在命令提示符中將顯示訊息“程式已完成”。

批處理指令碼 - 變數

批處理檔案中存在兩種型別的變數。一種是呼叫批處理檔案時可以傳遞的引數,另一種是透過 set 命令完成。

命令列引數

批處理指令碼支援命令列引數的概念,其中在呼叫批處理檔案時可以向其傳遞引數。可以透過變數 %1、%2、%3 等從批處理檔案中呼叫這些引數。

以下示例顯示一個接受 3 個命令列引數並將其回顯到命令列螢幕的批處理檔案。

@echo off 
echo %1 
echo %2 
echo %3

如果將上述批處理指令碼儲存在名為 test.bat 的檔案中,並且我們要像這樣執行批處理:

Test.bat 1 2 3

以下是執行批處理檔案時命令提示符中外觀的螢幕截圖。

Command Line Arguments

上述命令產生以下輸出。

1 
2 
3

如果我們要像這樣執行批處理:

Example 1 2 3 4

輸出將保持與上述相同。但是,將忽略第四個引數。

Set 命令

初始化變數的另一種方法是使用“set”命令。以下是 set 命令的語法。

語法

set /A variable-name=value

其中,

  • 變數名 是要設定的變數的名稱。

  • 是需要針對變數設定的值。

  • /A – 如果值需要是數字型別,則使用此開關。

以下示例顯示了 set 命令的簡單用法。

示例

@echo off 
set message=Hello World 
echo %message%
  • 在上面的程式碼片段中,定義了一個名為 message 的變數,並將其值設定為“Hello World”。

  • 要顯示變數的值,請注意需要將變數括在 % 符號中。

輸出

上述命令產生以下輸出。

Hello World

使用數值

在批處理指令碼中,也可以定義一個變數來儲存數值。這可以透過使用 /A 開關來完成。

以下程式碼顯示了一種使用 /A 開關設定數值的簡單方法。

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c%
  • 我們首先將 2 個變數 a 和 b 的值分別設定為 5 和 10。

  • 我們將這些值相加並存儲在變數 c 中。

  • 最後,我們顯示變數 c 的值。

上述程式的輸出將為 15。

所有算術運算子都可以在批處理檔案中使用。以下示例顯示瞭如何在批處理檔案中使用算術運算子。

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c% 
SET /A c = %a% - %b% 
echo %c% 
SET /A c = %b% / %a% 
echo %c% 
SET /A c = %b% * %a% 
echo %c%

上述命令產生以下輸出。

15 
-5 
2 
50

區域性變數與全域性變數

在任何程式語言中,都可以選擇將變數標記為具有某種作用域,即可以訪問它們的程式碼部分。通常,具有全域性作用域的變數可以在程式的任何位置訪問,而區域性作用域變數具有可以訪問它們的已定義邊界。

DOS 指令碼也對區域性和全域性作用域變數進行了定義。預設情況下,變數對於整個命令提示符會話都是全域性的。呼叫 SETLOCAL 命令可以使變數對指令碼的作用域區域性。呼叫 SETLOCAL 後,任何變數賦值都會在呼叫 ENDLOCAL、呼叫 EXIT 或執行到達指令碼中的檔案結尾 (EOF) 時恢復。以下示例顯示了在指令碼中設定區域性變數和全域性變數時的區別。

示例

@echo off 
set globalvar = 5
SETLOCAL
set var = 13145
set /A var = %var% + 5
echo %var%
echo %globalvar%
ENDLOCAL

關於上述程式,需要注意以下幾點。

  • “globalvar”定義為全域性作用域,可在整個指令碼中使用。

  • “var”變數定義在區域性作用域中,因為它包含在“SETLOCAL”和“ENDLOCAL”塊之間。因此,一旦執行“ENDLOCAL”語句,此變數將被銷燬。

輸出

上述命令產生以下輸出。

13150
5

你會注意到,命令 echo %var% 不會產生任何結果,因為在 ENDLOCAL 語句之後,“var”變數將不再存在。

使用環境變數

如果你的變數將在批處理檔案中使用,那麼最好使用環境變數。一旦定義了環境變數,就可以透過 % 符號訪問它。以下示例顯示如何檢視系統上定義的 JAVA_HOME。JAVA_HOME 變數是許多應用程式通常使用的關鍵元件。

@echo off 
echo %JAVA_HOME%

輸出將顯示 JAVA_HOME 目錄,這取決於不同的系統。以下是一個輸出示例。

C:\Atlassian\Bitbucket\4.0.1\jre

批處理指令碼 - 註釋

最好為建立的指令碼添加註釋或文件。這對於維護指令碼以理解指令碼的實際用途是必需的。

例如,考慮以下沒有註釋形式的程式碼段。如果任何沒有開發以下指令碼的普通人都試圖理解該指令碼,那麼這個人將需要花費大量時間來理解該指令碼的實際用途。

ECHO OFF 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
ECHO.%* | FIND "?" >NUL 
IF NOT ERRORLEVEL 1 GOTO Syntax 
IF NOT [%2]==[] GOTO Syntax 
SETLOCAL 
SET WSS= 
IF NOT [%1]==[] FOR /F "tokens = 1 delims = \ " %%A IN ('ECHO.%~1') DO SET WSS = %%A 
FOR /F "tokens = 1 delims = \ " %%a IN ('NET VIEW ^| FIND /I "\\%WSS%"') DO FOR /F 
"tokens = 1 delims = " %%A IN ('NBTSTAT -a %%a ^| FIND /I /V "%%a" ^| FIND "<03>"') 
DO ECHO.%%a %%A 
ENDLOCAL 
GOTO:EOF 
ECHO Display logged on users and their workstations. 
ECHO Usage: ACTUSR [ filter ] 
IF "%OS%"=="Windows_NT" ECHO Where: filter is the first part 
of the computer name^(s^) to be displayed

使用 Rem 語句添加註釋

在批處理指令碼中建立註釋有兩種方法;一種是透過 Rem 命令。Rem 語句後的任何文字都將被視為註釋,不會被執行。以下是此語句的常規語法。

語法

Rem Remarks

其中“備註”是要新增的註釋。

以下示例顯示了 Rem 命令的簡單用法。

示例

@echo off 
Rem This program just displays Hello World 
set message=Hello World 
echo %message%

輸出

上述命令產生以下輸出。你會注意到包含 Rem 語句的行不會被執行。

Hello World

使用 :: 語句添加註釋

在批處理指令碼中建立註釋的另一種方法是透過 :: 命令。 :: 語句後的任何文字都將被視為註釋,不會被執行。以下是此語句的常規語法。

語法

:: Remarks

其中“備註”是要新增的註釋。

以下示例顯示了 Rem 命令的簡單用法。

示例

@echo off 
:: This program just displays Hello World 
set message = Hello World 
echo %message%

輸出

上述命令產生以下輸出。你會注意到包含 :: 語句的行不會被執行。

Hello World

注意 − 如果有太多行的 Rem,可能會減慢程式碼速度,因為最終批處理檔案中的每一行程式碼仍然需要執行。

讓我們看看本主題開頭看到的較大指令碼的示例,並瞭解新增文件後的外觀。

::===============================================================
:: The below example is used to find computer and logged on users
::
::===============================================================
ECHO OFF 
:: Windows version check 
IF NOT "%OS%"=="Windows_NT" GOTO Syntax 
ECHO.%* | FIND "?" >NUL 
:: Command line parameter check 
IF NOT ERRORLEVEL 1 GOTO Syntax
IF NOT [%2]==[] GOTO Syntax 
:: Keep variable local 
SETLOCAL 
:: Initialize variable 
SET WSS= 
:: Parse command line parameter 
IF NOT [%1]==[] FOR /F "tokens = 1 delims = \ " %%A IN ('ECHO.%~1') DO SET WSS = %%A 
:: Use NET VIEW and NBTSTAT to find computers and logged on users 
FOR /F "tokens = 1 delims = \ " %%a IN ('NET VIEW ^| FIND /I "\\%WSS%"') DO FOR /F 
"tokens = 1 delims = " %%A IN ('NBTSTAT -a %%a ^| FIND /I /V "%%a" ^| FIND 
"<03>"') DO ECHO.%%a %%A 
:: Done 
ENDLOCAL
GOTO:EOF 
:Syntax 
ECHO Display logged on users and their workstations. 
ECHO Usage: ACTUSR [ filter ] 
IF "%OS%"=="Windows_NT" ECHO Where: filter is the first part of the 
computer name^(s^) to be displayed

你現在可以看到,對於沒有開發過程式碼的使用者來說,程式碼變得更容易理解,因此更易於維護。

批處理指令碼 - 字串

在 DOS 中,字串是字元的有序集合,例如“Hello, World!”。

序號 字串和描述
1 建立字串

可以在 DOS 中透過以下方式建立字串。

2 空字串

空字串

3 字串插值

字串插值是一種透過在其值內包含字串字面量來從常量、變數、字面量和表示式的混合中構造新的字串值的方法。

4 字串連線

可以使用 set 運算子連線兩個字串或一個字串和一個字元,或兩個字元。以下是一個簡單的示例,顯示瞭如何使用字串連線。

5 字串長度

在 DOS 指令碼中,沒有定義用於查詢字串長度的長度函式。可以使用自定義定義的函式來實現相同的功能。以下是一個自定義定義函式的示例,用於檢視字串的長度。

6 toInt

使用 set 變數設定為字串的變數可以使用 /A 開關轉換為整數,該開關使用 set 變數。以下示例顯示瞭如何實現此目的。

7 右對齊

這用於將文字右對齊,通常用於提高數字列的可讀性。

8 左字串

這用於從字串的開頭提取字元。

9 中間字串

這用於透過字串中字元的位置提取子字串。

10 刪除

字串替換功能也可用於從另一個字串中刪除子字串。

11 刪除兩端

這用於刪除字串的首尾字元。

12 刪除所有空格

這用於透過替換刪除字串中的所有空格。

13 替換字串

要將子字串替換為另一個字串,請使用字串替換功能。

14 右字串

這用於從字串的末尾提取字元。

批處理指令碼 - 陣列

陣列在批處理指令碼中未專門定義為一種型別,但可以實現。在批處理指令碼中實現陣列時,需要注意以下幾點。

  • 需要使用 set 命令定義陣列的每個元素。
  • 需要使用“for”迴圈來迭代陣列的值。

建立陣列

可以使用以下 set 命令建立陣列。

set a[0]=1

其中 0 是陣列的索引,1 是分配給陣列第一個元素的值。

實現陣列的另一種方法是定義值列表並迭代值列表。以下示例顯示瞭如何實現。

示例

@echo off 
set list = 1 2 3 4 
(for %%a in (%list%) do ( 
   echo %%a 
))

輸出

上述命令產生以下輸出。

1
2
3
4

訪問陣列

可以透過使用下標語法檢索陣列中的值,在下標語法中,在陣列名稱之後立即傳遞要檢索的值的索引(方括號內)。

示例

@echo off 
set a[0]=1 
echo %a[0]%

在此示例中,索引從 0 開始,這意味著可以使用索引 0 訪問第一個元素,可以使用索引 1 訪問第二個元素,依此類推。讓我們檢查以下示例以建立、初始化和訪問陣列:

@echo off
set a[0] = 1 
set a[1] = 2 
set a[2] = 3 
echo The first element of the array is %a[0]% 
echo The second element of the array is %a[1]% 
echo The third element of the array is %a[2]%

上述命令產生以下輸出。

The first element of the array is 1 
The second element of the array is 2 
The third element of the array is 3

修改陣列

要向陣列末尾新增元素,可以使用`set`命令結合陣列最後一個元素的索引。

示例

@echo off 
set a[0] = 1  
set a[1] = 2  
set a[2] = 3 
Rem Adding an element at the end of an array 
Set a[3] = 4 
echo The last element of the array is %a[3]%

上述命令產生以下輸出。

The last element of the array is 4

可以透過在給定索引處賦值來修改陣列中已有的元素,如下例所示:

@echo off 
set a[0] = 1 
set a[1] = 2  
set a[2] = 3 
Rem Setting the new value for the second element of the array 
Set a[1] = 5 
echo The new value of the second element of the array is %a[1]%

上述命令產生以下輸出。

The new value of the second element of the array is 5

陣列迭代

陣列迭代是透過使用`for`迴圈遍歷陣列的每個元素來實現的。下面的例子展示了一種簡單的陣列實現方法。

@echo off 
setlocal enabledelayedexpansion 
set topic[0] = comments 
set topic[1] = variables 
set topic[2] = Arrays 
set topic[3] = Decision making 
set topic[4] = Time and date 
set topic[5] = Operators 

for /l %%n in (0,1,5) do ( 
   echo !topic[%%n]! 
)

關於上述程式,需要注意以下幾點:

  • 每個陣列元素都需要使用`set`命令顯式定義。

  • 使用帶有`/L`引數的`for`迴圈遍歷陣列。

輸出

上述命令產生以下輸出。

Comments 
variables 
Arrays 
Decision making 
Time and date 
Operators

陣列長度

陣列長度的計算方法是迭代陣列中的值列表,因為沒有直接的函式可以確定陣列中元素的數量。

@echo off 
set Arr[0] = 1 
set Arr[1] = 2 
set Arr[2] = 3 
set Arr[3] = 4 
set "x = 0" 
:SymLoop 

if defined Arr[%x%] ( 
   call echo %%Arr[%x%]%% 
   set /a "x+=1"
   GOTO :SymLoop 
)
echo "The length of the array is" %x%

輸出

輸出 以上命令產生以下輸出。

The length of the array is 4

在陣列中建立結構

透過一些額外的編碼,也可以在批處理檔案中實現結構。下面的例子展示瞭如何實現這一點。

示例

@echo off 
set len = 3 
set obj[0].Name = Joe 
set obj[0].ID = 1 
set obj[1].Name = Mark 
set obj[1].ID = 2 
set obj[2].Name = Mohan 
set obj[2].ID = 3 
set i = 0 
:loop 

if %i% equ %len% goto :eof 
set cur.Name= 
set cur.ID=

for /f "usebackq delims==.tokens=1-3" %%j in (`set obj[%i%]`) do ( 
   set cur.%%k=%%l 
) 
echo Name = %cur.Name% 
echo Value = %cur.ID% 
set /a i = %i%+1 
goto loop

關於以上程式碼,需要注意以下幾點:

  • 每個使用`set`命令定義的變數都與陣列的每個索引關聯有兩個值。

  • 變數i被設定為0,以便我們能夠迴圈遍歷長度為3的陣列結構。

  • 我們始終檢查條件:i的值是否等於len的值,如果不是,則迴圈執行程式碼。

  • 我們可以使用`obj[%i%]`表示法訪問結構的每個元素。

輸出

上述命令產生以下輸出。

Name = Joe 
Value = 1 
Name = Mark 
Value = 2 
Name = Mohan 
Value = 3

批處理指令碼 - 決策

決策結構要求程式設計師指定一個或多個條件供程式評估或測試,以及如果條件被判斷為true則要執行的語句,以及可選地,如果條件被判斷為false則要執行的其他語句。

序號 字串和描述
1 If語句

第一個決策語句是`if`語句。

2 If/else語句

下一個決策語句是If/else語句。以下是此語句的一般形式。

3 巢狀If語句

有時,需要將多個`if`語句巢狀在彼此內部。以下是此語句的一般形式。

批處理指令碼 - 運算子

運算子是告訴編譯器執行特定數學或邏輯運算的符號。

在批處理指令碼中,可以使用以下型別的運算子。

  • 算術運算子
  • 關係運算符
  • 邏輯運算子
  • 賦值運算子
  • 位運算子

算術運算子

批處理指令碼語言支援與任何其他語言相同的標準算術運算子。以下是可用的算術運算子。

示例

運算子 描述 示例
+ 兩個運算元相加 1 + 2 結果為 3
從第一個運算元中減去第二個運算元 2 − 1 結果為 1
* 兩個運算元相乘 2 * 2 結果為 4
/ 分子除以分母 3 / 2 結果為 1.5
% 取模運算子,返回整數/浮點數除法後的餘數 3 % 2 結果為 1

關係運算符

關係運算符允許比較物件。以下是可用的關係運算符。

示例

運算子 描述 示例
EQU 測試兩個物件是否相等 2 EQU 2 結果為 true
NEQ 測試兩個物件是否不相等 3 NEQ 2 結果為 true
LSS 檢查左運算元是否小於右運算元 2 LSS 3 結果為 true
LEQ 檢查左運算元是否小於或等於右運算元 2 LEQ 3 結果為 true
GTR 檢查左運算元是否大於右運算元 3 GTR 2 結果為 true
GEQ 檢查左運算元是否大於或等於右運算元 3 GEQ 2 結果為 true

邏輯運算子

邏輯運算子用於評估布林表示式。以下是可用的邏輯運算子。

批處理語言配備了完整的布林邏輯運算子集,如AND、OR、XOR,但僅限於二進位制數。也沒有 TRUE 或 FALSE 的值。唯一可用於條件的邏輯運算子是 NOT 運算子。

示例

運算子 描述
AND 這是邏輯“與”運算子
OR 這是邏輯“或”運算子
NOT 這是邏輯“非”運算子

賦值運算子

批處理指令碼語言也提供賦值運算子。以下是可用的賦值運算子。

示例

運算子 描述 示例
+= 將右運算元新增到左運算元,並將結果賦值給左運算元

Set /A a = 5

a += 3

輸出結果為 8

-= 從左運算元中減去右運算元,並將結果賦值給左運算元

Set /A a = 5

a -= 3

輸出結果為 2

*= 將右運算元乘以左運算元,並將結果賦值給左運算元

Set /A a = 5

a *= 3

輸出結果為 15

/= 將左運算元除以右運算元,並將結果賦值給左運算元

Set /A a = 6

a /= 3

輸出結果為 2

%= 使用兩個運算元取模,並將結果賦值給左運算元

Set /A a = 5

a %= 3

輸出結果為 2

位運算子

批處理指令碼中也支援位運算子。以下是可用的運算子。

示例

運算子 描述
& 這是位“與”運算子
| 這是位“或”運算子
^ 這是位“異或”或“互斥或”運算子

以下是展示這些運算子的真值表。

p q p & q p | q p ^ q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1

批處理指令碼 - 日期和時間

在 DOS 指令碼中,日期和時間有兩個基本的命令用於檢索系統的日期和時間。

DATE

此命令獲取系統日期。

語法

DATE

示例

@echo off 
echo %DATE%

輸出

當前日期將顯示在命令提示符中。例如:

Mon 12/28/2015

TIME

此命令設定或顯示時間。

語法

TIME

示例

@echo off 
echo %TIME%

輸出

將顯示當前系統時間。例如:

22:06:52.87

以下是一些可用於獲取不同格式的日期和時間的實現。

格式為年-月-日的日期

示例

@echo off 
echo/Today is: %year%-%month%-%day% 
goto :EOF 
setlocal ENABLEEXTENSIONS 
set t = 2&if "%date%z" LSS "A" set t = 1 

for /f "skip=1 tokens = 2-4 delims = (-)" %%a in ('echo/^|date') do ( 
   for /f "tokens = %t%-4 delims=.-/ " %%d in ('date/t') do ( 
      set %%a=%%d&set %%b=%%e&set %%c=%%f)) 
endlocal&set %1=%yy%&set %2=%mm%&set %3=%dd%&goto :EOF

輸出

上述命令產生以下輸出。

Today is: 2015-12-30

批處理指令碼 - 輸入/輸出

有三個通用的“檔案”用於鍵盤輸入、螢幕文字列印和螢幕錯誤列印。“標準輸入”檔案,稱為stdin,包含程式/指令碼的輸入。“標準輸出”檔案,稱為stdout,用於將輸出寫入螢幕顯示。最後,“標準錯誤”檔案,稱為stderr,包含任何要在螢幕上顯示的錯誤訊息。

這三個標準檔案(也稱為標準流)分別用數字 0、1 和 2 引用。Stdin 是檔案 0,stdout 是檔案 1,stderr 是檔案 2。

重定向輸出 (Stdout 和 Stderr)

批處理檔案的一個常見做法是將程式的輸出傳送到日誌檔案。`>` 運算子將 stdout 或 stderr 傳送或重定向到另一個檔案。以下示例顯示瞭如何執行此操作。

Dir C:\ > list.txt

在上面的例子中,命令 `Dir C:\` 的 stdout 被重定向到檔案 list.txt。

如果將數字 2 附加到重定向過濾器,則它會將 stderr 重定向到檔案 lists.txt。

Dir C:\ 2> list.txt

甚至可以使用檔案編號和 `&` 字首組合 stdoutstderr 流。以下是一個示例。

DIR C:\ > lists.txt 2>&1

抑制程式輸出

偽檔案 NUL 用於丟棄程式的任何輸出。以下示例顯示命令 DIR 的輸出透過將輸出傳送到 NUL 而被丟棄。

Dir C:\ > NUL

Stdin

要使用 Stdin,必須使用變通方法來實現這一點。這可以透過重定向命令提示符自身的 stdin(稱為 CON)來完成。

以下示例顯示如何將輸出重定向到名為 lists.txt 的檔案。執行以下命令後,命令提示符將接收使用者輸入的所有內容,直到收到 EOF 字元。之後,它將所有輸入傳送到檔案 lists.txt。

TYPE CON > lists.txt

批處理指令碼 - 返回程式碼

預設情況下,當命令列執行完成時,如果執行成功則應返回零,如果執行失敗則返回非零值。當批處理指令碼執行失敗後返回非零值時,非零值將指示錯誤號。然後,我們將使用錯誤號來確定錯誤是什麼,並相應地解決它。

以下是常見的退出程式碼及其描述。

錯誤程式碼 描述
0 程式成功完成。
1 函式不正確。指示 Action 試圖在 Windows 命令提示符 cmd.exe 中執行無法識別的命令。
2 系統找不到指定的檔案。指示無法在指定位置找到該檔案。
3 系統找不到指定的路徑。指示找不到指定的路徑。
5 訪問被拒絕。指示使用者無權訪問指定的資源。

9009

0x2331

程式無法識別為內部或外部命令、可操作程式或批處理檔案。指示在配置 Action 時命令、應用程式名稱或路徑拼寫錯誤。

221225495

0xC0000017

-1073741801

沒有足夠的虛擬記憶體可用。

這表示 Windows 記憶體不足。

3221225786

0xC000013A

-1073741510

應用程式由於 CTRL+C 而終止。指示應用程式已由使用者的鍵盤輸入 CTRL+C 或 CTRL+Break 或關閉命令提示符視窗而終止。

3221225794

0xC0000142

-1073741502

應用程式未能正確初始化。指示應用程式已在當前使用者無權訪問的桌面上啟動。另一個可能的原因是 gdi32.dll 或 user32.dll 無法初始化。

錯誤級別

環境變數 %ERRORLEVEL% 包含最後執行的程式或指令碼的返回程式碼。

預設情況下,檢查 ERRORLEVEL 的方法如下所示。

語法

IF %ERRORLEVEL% NEQ 0 ( 
   DO_Something 
)

在批處理檔案末尾使用命令 `EXIT /B %ERRORLEVEL%` 來返回批處理檔案的錯誤程式碼是很常見的。

`EXIT /B` 在批處理檔案末尾將停止批處理檔案的執行。

在批處理檔案末尾使用 `EXIT /B ` 返回自定義返回程式碼。

環境變數 %ERRORLEVEL% 包含批處理檔案中最新的錯誤級別,即最後執行的命令的最新錯誤程式碼。在批處理檔案中,始終最好使用環境變數而不是常量值,因為相同的變數在不同的計算機上擴充套件到不同的值。

讓我們來看一個快速示例,說明如何檢查批處理檔案中的錯誤程式碼。

示例

假設我們有一個名為 Find.cmd 的批處理檔案,其中包含以下程式碼。在程式碼中,我們明確提到,如果找不到名為 lists.txt 的檔案,則應將 errorlevel 設定為 7。同樣,如果我們看到使用者配置檔案變數未定義,則應將 errorlevel 程式碼設定為 9。

if not exist c:\lists.txt exit 7 
if not defined userprofile exit 9 
exit 0

假設我們還有另一個名為 App.cmd 的檔案,它首先呼叫 Find.cmd。現在,如果 Find.cmd 返回一個錯誤,其中它將 errorlevel 設定為大於 0,則它將退出程式。在下面的批處理檔案中,呼叫 Find.cnd 後,它實際上會檢查 errorlevel 是否大於 0。

Call Find.cmd

if errorlevel gtr 0 exit 
echo “Successful completion”

輸出

在上述程式中,我們可以將以下場景作為輸出:

  • 如果檔案 c:\lists.txt 不存在,則控制檯輸出中不會顯示任何內容。

  • 如果變數 userprofile 不存在,則控制檯輸出中不會顯示任何內容。

  • 如果上述兩個條件都成立,則命令提示符中將顯示字串“成功完成”。

迴圈

在決策章節中,我們看到了按順序一個接一個執行的語句。此外,批處理指令碼中也可以實現更改程式邏輯中控制流的方法。然後將其分類為控制流語句。

序號 迴圈和描述
1 While 語句實現

批處理指令碼中沒有直接的 while 語句,但是我們可以使用 if 語句和標籤非常輕鬆地實現此迴圈。

2 For 語句 - 列表實現

“FOR”結構為批處理檔案提供了迴圈功能。以下是用於處理值列表的“for”語句的常用結構。

3 遍歷範圍

“for”語句還可以遍歷一系列值。以下是語句的通用形式。

4 經典 for 迴圈實現

以下是大多數程式語言中都可用的經典“for”語句。

遍歷命令列引數

“for”語句也可用於檢查命令列引數。以下示例顯示瞭如何使用“for”語句遍歷命令列引數。

示例

@ECHO OFF 
:Loop 

IF "%1"=="" GOTO completed 
FOR %%F IN (%1) DO echo %%F 
SHIFT 
GOTO Loop 
:completed

輸出

假設我們的上述程式碼儲存在一個名為 Test.bat 的檔案中。如果批處理檔案將 1、2 和 3 作為命令列引數傳遞給 Test.bat 1 2 3,則上述命令將產生以下輸出。

1 
2 
3

序號 迴圈和描述
1 Break 語句實現

break 語句用於更改任何程式語言中迴圈內的控制流。break 語句通常用於迴圈結構中,用於導致立即終止最內層的封閉迴圈。

批處理指令碼 - 函式

函式是一組組織在一起以執行特定任務的語句。在批處理指令碼中,採用類似的方法將邏輯語句組合在一起以形成函式。

與任何其他語言一樣,批處理指令碼中的函式遵循相同的過程:

  • 函式宣告 - 它告訴編譯器函式的名稱、返回型別和引數。

  • 函式定義 - 它提供函式的實際主體。

函式定義

在批處理指令碼中,函式是使用 label 語句定義的。當新定義函式時,它可以將一個或多個值作為輸入“引數”傳遞給函式,處理主體中的函式,並將值作為輸出“返回型別”傳遞迴函式。

每個函式都有一個函式名稱,它描述了函式執行的任務。要使用函式,您可以使用其名稱“呼叫”該函式,並傳遞與其引數型別匹配的輸入值(稱為引數)。

以下是簡單函式的語法。

:function_name 
Do_something 
EXIT /B 0
  • function_name 是賦予函式的名稱,該名稱應該具有一定的意義,以匹配函式實際執行的操作。

  • EXIT 語句用於確保函式正確退出。

以下是一個簡單函式的示例。

示例

:Display 
SET /A index=2 
echo The value of index is %index% 
EXIT /B 0
序號 函式和描述
1 呼叫函式

在批處理指令碼中,使用 call 命令呼叫函式。

2 帶引數的函式

函式可以透過在呼叫函式時簡單地傳遞引數來使用引數。

3 帶返回值的函式

函式可以透過簡單地傳遞變數名來使用返回值。

4 函式中的區域性變數

函式中的區域性變數可用於避免命名衝突並將變數更改限制在函式範圍內。

5 遞迴函式

透過將變數更改限制在函式範圍內並對呼叫者不可見來完全封裝函式主體。

6 檔案I/O

在批處理指令碼中,可以執行任何程式語言中都期望執行的常規檔案 I/O 操作。

7 建立檔案

新檔案的建立是在重定向過濾器 > 的幫助下完成的。此過濾器可用於將任何輸出重定向到檔案。

8 寫入檔案

內容寫入檔案也是在重定向過濾器 > 的幫助下完成的。此過濾器可用於將任何輸出重定向到檔案。

9 追加到檔案

內容寫入檔案也是在雙重定向過濾器 >> 的幫助下完成的。此過濾器可用於將任何輸出追加到檔案。

10 從檔案讀取

批處理指令碼中的檔案讀取是透過使用 FOR 迴圈命令遍歷需要讀取的檔案中定義的每一行來完成的。

11 刪除檔案

對於刪除檔案,批處理指令碼提供了 DEL 命令。

12 重新命名檔案

對於重新命名檔案,批處理指令碼提供了 REN 或 RENAME 命令。

13 移動檔案

對於移動檔案,批處理指令碼提供了 MOVE 命令。

14 批處理檔案 - 管道

管道運算子 (|) 獲取一個命令的輸出(預設情況下為 STDOUT),並將其定向到另一個命令的輸入(預設情況下為 STDIN)。

15 批處理檔案 - 輸入

執行批處理檔案時,您可以選擇傳入命令列引數,然後可以在程式中讀取這些引數以進行進一步處理。

16 使用 SHIFT 運算子

命令列引數的一個限制是它只能接受到 %9 的引數。讓我們來看一下這個限制的示例。

17 資料夾

在批處理指令碼中,可以執行任何程式語言中都期望執行的常規基於資料夾的操作。

18 建立資料夾

資料夾的建立是在 MD(建立目錄)命令的幫助下完成的。

19 列出資料夾內容

可以使用 dir 命令列出資料夾內容。此命令允許您檢視當前目錄中可用的檔案和目錄。

20 刪除資料夾

對於刪除資料夾,批處理指令碼提供了 DEL 命令。

21 重新命名資料夾

對於重新命名資料夾,批處理指令碼提供了 REN 或 RENAME 命令。

22 移動資料夾

對於移動資料夾,批處理指令碼提供了 MOVE 命令。

批處理指令碼 - 程序

在本章中,我們將討論批處理指令碼中涉及的各種過程。

檢視正在執行的程序列表

在批處理指令碼中,可以使用 TASKLIST 命令獲取系統中當前正在執行的程序列表。

語法

TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter]
[/FO format] [/NH]
序號 選項和描述
1.

/S system

指定要連線到的遠端系統

2.

/U

[domain\]user

指定命令應在其下執行的使用者上下文。

3.

/P [password]

指定給定使用者上下文密碼。如果省略,則提示輸入。

4.

/M [module]

列出當前使用給定 exe/dll 名稱的所有任務。如果未指定模組名稱,則會顯示所有已載入的模組。

5.

/SVC

顯示每個程序中託管的服務。

6.

/V

顯示詳細的任務資訊。

7.

/FI filter

顯示一組與過濾器指定的給定條件匹配的任務。

8.

/FO format

指定輸出格式。有效值:“TABLE”、“LIST”、“CSV”。

9.

/NH

指定輸出中不應顯示“列標題”。僅對“TABLE”和“CSV”格式有效。

示例

TASKLIST

上述命令將獲取本地系統上正在執行的所有程序的列表。以下是執行上述命令時呈現的輸出快照。從以下輸出可以看出,您不僅可以獲取系統上正在執行的各種程序,還可以獲取每個程序的記憶體使用情況。

Image Name                    PID       Session Name       Session#     Mem Usage
========================= ========    ================ =========== ============
System Idle Process             0        Services            0              4 K
System                          4        Services            0            272 K
smss.exe                      344        Services            0          1,040 K
csrss.exe                     528        Services            0          3,892 K
csrss.exe                     612        Console             1         41,788 K
wininit.exe                   620        Services            0          3,528 K
winlogon.exe                  648        Console             1          5,884 K
services.exe                  712        Services            0          6,224 K
lsass.exe                     720        Services            0          9,712 K
svchost.exe                   788        Services            0         10,048 K
svchost.exe                   832        Services            0          7,696 K
dwm.exe                       916        Console             1        117,440 K
nvvsvc.exe                    932        Services            0          6,692 K
nvxdsync.exe                  968        Console             1         16,328 K
nvvsvc.exe                    976        Console             1         12,756 K
svchost.exe                  1012        Services            0         21,648 K
svchost.exe                   236        Services            0         33,864 K
svchost.exe                   480        Services            0         11,152 K
svchost.exe                  1028        Services            0         11,104 K
svchost.exe                  1048        Services            0         16,108 K
wlanext.exe                  1220        Services            0         12,560 K
conhost.exe                  1228        Services            0          2,588 K
svchost.exe                  1276        Services            0         13,888 K
svchost.exe                  1420        Services            0         13,488 K
spoolsv.exe                  1556        Services            0          9,340 K

tasklist > process.txt

上述命令獲取 tasklist 顯示的輸出並將其儲存到 process.txt 檔案中。

tasklist /fi "memusage gt 40000"

上述命令僅獲取記憶體大於 40MB 的那些程序。以下是可以呈現的示例輸出。

Image Name                    PID      Session Name     Session#     Mem Usage
=========================   ======== ================ =========== ============
dwm.exe                        916     Console             1        127,912 K
explorer.exe                  2904     Console             1        125,868 K
ServerManager.exe             1836     Console             1         59,796 K
WINWORD.EXE                   2456     Console             1        144,504 K
chrome.exe                    4892     Console             1        123,232 K
chrome.exe                    4976     Console             1         69,412 K
chrome.exe                    1724     Console             1         76,416 K
chrome.exe                    3992     Console             1         56,156 K
chrome.exe                    1168     Console             1        233,628 K
chrome.exe                     816     Console             1         66,808 K

殺死特定程序

允許執行 Microsoft Windows XP Professional、Windows 2003 或更高版本的使用者透過程序 ID (PID) 或影像名稱從 Windows 命令列終止任務。用於此目的的命令是 TASKKILL 命令。

語法

TASKKILL [/S system [/U username [/P [password]]]] { [/FI filter] 
[/PID processid | /IM imagename] } [/T] [/F]
序號 選項和描述
1.

/S system

指定要連線到的遠端系統

2.

/U

[domain\]user

指定命令應在其下執行的使用者上下文。

3.

/P [password]

指定給定使用者上下文密碼。如果省略,則提示輸入。

4.

/FI

FilterName

應用過濾器以選擇一組任務。允許使用“*”。例如 imagename eq acme* 請參見下面的過濾器以獲取其他資訊和示例。

5.

/PID

processID

指定要終止的程序的 PID。使用 TaskList 獲取 PID。

6.

/IM

ImageName

指定要終止的程序的影像名稱。萬用字元“*”可用於指定所有任務或影像名稱。

7.

/T

終止指定的程序及其由其啟動的任何子程序。

8.

/F

指定強制終止程序。

示例

taskkill /f /im notepad.exe

上述命令將殺死開啟的記事本任務(如果已開啟)。

taskill /pid 9214

上述命令將殺死程序 ID 為 9214 的程序。

啟動新程序

DOS 指令碼還可以啟動一個全新的程序。這是透過使用 START 命令實現的。

語法

START "title" [/D path] [options] "command" [parameters]

其中

  • title - CMD 視窗標題欄的文字(必需)。

  • path - 啟動目錄。

  • command - 要執行的命令、批處理檔案或可執行程式。

  • parameters - 傳遞給命令的引數。

序號 選項和描述
1.

/MIN

最小化啟動視窗

2.

/MAX

最大化啟動視窗。

3.

/LOW

使用空閒優先順序類。

4.

/NORMAL

使用普通優先順序類。

5.

/ABOVENORMAL

使用高於正常的優先順序類。

6.

/BELOWNORMAL

使用低於正常的優先順序類。

7.

/HIGH

使用高優先順序類。

8.

/REALTIME

使用即時優先順序類。

示例

START "Test Batch Script" /Min test.bat

上述命令將在新視窗中執行批處理指令碼 test.bat。視窗將以最小化模式啟動,並且標題為“測試批處理指令碼”。

START "" "C:\Program Files\Microsoft Office\Winword.exe" "D:\test\TESTA.txt"

上述命令實際上將在另一個程序中執行 Microsoft Word,然後在 MS Word 中開啟檔案 TESTA.txt。

批處理指令碼 - 別名

別名意味著為現有命令建立快捷方式或關鍵字。假設我們要執行以下命令,它只是帶有 /w 選項的目錄列表命令,該選項不會在目錄列表中顯示所有必要的詳細資訊。

Dir /w

假設我們要為此命令建立一個快捷方式,如下所示。

dw = dir /w

如果要執行dir /w命令,只需輸入dw。現在,“dw”已成為Dir /w命令的別名。

建立別名

別名由doskey命令管理。

語法

DOSKEY [options] [macroname=[text]]

其中

  • macroname − 宏的簡短名稱。

  • text − 要呼叫的命令。

以下是可用於DOSKEY命令的選項說明。

序號 選項和描述
1.

/REINSTALL

安裝新的Doskey副本。

2.

/LISTSIZE = size

設定命令歷史緩衝區的大小。

3.

/MACROS

顯示所有Doskey宏。

4.

/MACROS:ALL

顯示所有具有Doskey宏的可執行檔案的全部Doskey宏。

5.

/MACROS:exename

顯示給定可執行檔案的所有Doskey宏。

6.

/HISTORY

顯示儲存在記憶體中的所有命令。

7.

/INSERT

指定輸入的新文字將插入到舊文字中。

8.

/OVERSTRIKE

指定新文字將覆蓋舊文字。

9.

/EXENAME = exename

指定可執行檔案。

10.

/MACROFILE = filename

指定要安裝的宏檔案。

11.

macroname

指定建立的宏的名稱。

12.

text

指定要記錄的命令。

示例

建立一個名為keys.bat的新檔案,並在檔案中輸入以下命令。以下命令建立兩個別名,一個用於cd命令(自動進入名為test的目錄),另一個用於dir命令。

@echo off
doskey cd = cd/test
doskey d = dir

執行命令後,您可以在命令提示符下執行這些別名。

輸出

以下螢幕截圖顯示,在執行上述建立的批處理檔案後,您可以自由輸入“d”命令,它將提供目錄列表,這意味著您的別名已建立。

Alias Example Output

刪除別名

可以透過將宏的值設定為NULL來刪除別名或宏。

示例

@echo off
doskey cd = cd/test
doskey d = dir
d= 

在上面的示例中,我們首先將宏d設定為d = dir。然後將其設定為NULL。因為我們將d的值設定為NULL,所以宏d將被刪除。

替換別名

可以透過將宏的值設定為新的期望值來替換別名或宏。

示例

@echo off
doskey cd = cd/test
doskey d = dir

d = dir /w

在上面的示例中,我們首先將宏d設定為d = dir。然後將其設定為dir /w。由於我們將d的值設定為新值,“d”別名現在將採用新值。

批處理指令碼 - 裝置

Windows現在有一個改進的庫,可以在批處理指令碼中用於處理連線到系統的裝置。這稱為裝置控制檯 – DevCon.exe。

Windows驅動程式開發人員和測試人員可以使用DevCon驗證驅動程式是否已正確安裝和配置,包括正確的INF檔案、驅動程式堆疊、驅動程式檔案和驅動程式包。您還可以使用DevCon命令(啟用、停用、安裝、啟動、停止和繼續)在指令碼中測試驅動程式。DevCon是一個命令列工具,可在本地計算機和遠端計算機上執行裝置管理功能。

顯示驅動程式和裝置資訊 DevCon可以顯示本地計算機和遠端計算機(執行Windows XP及更早版本)上的驅動程式和裝置的以下屬性:

  • 硬體ID、相容ID和裝置例項ID。這些識別符號在裝置識別符號字串中有詳細說明。

  • 裝置安裝類。

  • 裝置安裝類中的裝置。

  • INF檔案和裝置驅動程式檔案。

  • 驅動程式包的詳細資訊。

  • 硬體資源。

  • 裝置狀態。

  • 預期的驅動程式堆疊。

  • 驅動程式儲存中的第三方驅動程式包。

  • 搜尋裝置 DevCon可以透過硬體ID、裝置例項ID或裝置安裝類搜尋本地或遠端計算機上已安裝和未安裝的裝置。

  • 更改裝置設定 DevCon可以透過以下方式更改本地計算機上即插即用(PnP)裝置的狀態或配置:

    • 啟用裝置。

    • 停用裝置。

    • 更新驅動程式(互動式和非互動式)。

    • 安裝裝置(建立devnode並安裝軟體)。

    • 從裝置樹中刪除裝置並刪除其裝置堆疊。

    • 重新掃描即插即用裝置。

    • 新增、刪除和重新排序根列舉裝置的硬體ID。

    • 更改裝置安裝類的上層和下層篩選器驅動程式。

    • 新增和刪除驅動程式儲存中的第三方驅動程式包。

安裝WDK、Visual Studio和Windows SDK for desktop apps時,將包含DevCon (DevCon.exe)。安裝後,DevCon.exe工具包位於以下位置:

%WindowsSdkDir%\tools\x64\devcon.exe
%WindowsSdkDir%\tools\x86\devcon.exe
%WindowsSdkDir%\tools\arm\devcon.exe

語法

devcon [/m:\\computer] [/r] command [arguments]

其中

  • /m:\\computer − 在指定的遠端計算機上執行命令。反斜槓是必需的。

  • /r − 條件重新啟動。僅當需要重新啟動才能使更改生效時,在完成操作後重新啟動系統。

  • command − 指定DevCon命令。

  • 要列出並顯示有關計算機上裝置的資訊,請使用以下命令:

    • DevCon HwIDs

    • DevCon Classes

    • DevCon ListClass

    • DevCon DriverFiles

    • DevCon DriverNodes

    • DevCon Resources

    • DevCon Stack

    • DevCon Status

    • DevCon Dp_enum

  • 要搜尋有關計算機上裝置的資訊,請使用以下命令:

    • DevCon Find

    • DevCon FindAll

  • 要操作裝置或更改其配置,請使用以下命令:

    • DevCon Enable

    • DevCon Disable

    • DevCon Update

    • DevCon UpdateNI

    • DevCon Install

    • DevCon Remove

    • DevCon Rescan

    • DevCon Restart

    • DevCon Reboot

    • DevCon SetHwID

    • DevCon ClassFilter

    • DevCon Dp_add

    • DevCon Dp_delete

示例

以下是一些關於如何使用DevCon命令的示例。

List all driver files

以下命令使用DevCon DriverFiles操作列出系統上裝置使用的驅動程式的檔名。該命令使用萬用字元字元(*)表示系統上的所有裝置。由於輸出很長,因此該命令使用重定向字元(>)將輸出重定向到參考檔案driverfiles.txt。

devcon driverfiles * > driverfiles.txt

以下命令使用DevCon status操作查詢本地計算機上所有裝置的狀態。然後將其狀態儲存到status.txt檔案中,以便記錄或稍後檢視。該命令使用萬用字元字元(*)表示所有裝置,並使用重定向字元(>)將輸出重定向到status.txt檔案。

devcon status * > status.txt

以下命令透過在DevCon Enable命令中指定印表機安裝類來啟用計算機上的所有印表機裝置。該命令包含/r引數,如果需要重新啟動才能使啟用生效,則重新啟動系統。

devcon /r enable = Printer

以下命令使用DevCon Install操作在本地計算機上安裝鍵盤裝置。該命令包含裝置的INF檔案的完整路徑(keyboard.inf)和硬體ID(*PNP030b)。

devcon /r install c:\windows\inf\keyboard.inf *PNP030b

以下命令將掃描計算機以查詢新裝置。

devcon scan

以下命令將重新掃描計算機以查詢新裝置。

devcon rescan

批處理指令碼 - 登錄檔

登錄檔是Windows系統中的關鍵元素之一。它包含有關作業系統各個方面的大量資訊。幾乎所有安裝在Windows系統上的應用程式都以某種形式與登錄檔互動。

登錄檔包含兩個基本元素:鍵和值。登錄檔鍵是類似於資料夾的容器物件。登錄檔值是非容器物件,類似於檔案。鍵可能包含值或其他鍵。鍵使用類似於Windows路徑名的語法進行引用,使用反斜槓表示層次結構級別。

本章介紹各種功能,例如查詢值、新增、刪除和編輯登錄檔中的值。

序號 登錄檔型別及說明
1 從登錄檔讀取

從登錄檔讀取是透過REG QUERY命令完成的。

2 新增到登錄檔

新增到登錄檔是透過REG ADD命令完成的。

3 從登錄檔刪除

從登錄檔刪除是透過REG DEL命令完成的。

4 複製登錄檔鍵

從登錄檔複製是透過REG COPY命令完成的。

5 比較登錄檔鍵

比較登錄檔鍵是透過REG COMPARE命令完成的。

批處理指令碼 - 網路

批處理指令碼具有處理網路設定的功能。NET命令用於更新、修復或檢視網路或網路設定。本章介紹NET命令可用的不同選項。

序號 NET命令及說明
1 NET ACCOUNTS

檢視計算機的當前密碼和登入限制。

2 NET CONFIG

顯示您當前的伺服器或工作組設定。

3 NET COMPUTER

新增或刪除連線到Windows域控制器的計算機。

4 NET USER

此命令可用於以下用途:

檢視特定使用者帳戶的詳細資訊。

5 NET STOP/START

此命令用於停止和啟動特定服務。

6 NET STATISTICS

顯示工作站或伺服器的網路統計資訊。

7 NET USE

連線或斷開計算機與共享資源的連線,或顯示有關連線的資訊。

批處理指令碼 - 列印

也可以透過NET PRINT命令在批處理指令碼中控制列印。

語法

PRINT [/D:device] [[drive:][path]filename[...]]

其中/D:device - 指定列印裝置。

示例

print c:\example.txt /c /d:lpt1

上述命令將example.txt檔案列印到並行埠lpt1。

命令列印表機控制

從Windows 2000開始,可以使用PRINTUI.DLL和RUNDLL32.EXE從Windows命令列配置許多(但不是全部)印表機設定。

語法

RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry [ options ] [ @commandfile ]

其中一些可用選項如下:

  • /dl − 刪除本地印表機。

  • /dn − 刪除網路印表機連線。

  • /dd − 刪除印表機驅動程式。

  • /e − 顯示列印首選項。

  • /f[file] − INF檔案或輸出檔案。

  • /F[file] − /f指定的INF檔案可能依賴的INF檔案的位置。

  • /ia − 使用INF檔案安裝印表機驅動程式。

  • /id − 使用新增印表機驅動程式嚮導安裝印表機驅動程式。

  • /if − 使用INF檔案安裝印表機。

  • /ii − 使用新增印表機嚮導和INF檔案安裝印表機。

  • /il − 使用新增印表機嚮導安裝印表機。

  • /in − 新增網路印表機連線。

  • /ip − 使用網路印表機安裝嚮導安裝印表機。

  • /k − 將測試頁列印到指定的印表機,安裝印表機時不能與其他命令組合使用。

  • /l[path] − 印表機驅動程式源路徑。

  • /m[model] − 印表機驅動程式型號名稱。

  • /n[name] − 印表機名稱。

  • /o − 顯示列印佇列檢視。

  • /p − 顯示印表機屬性。

  • /Ss − 將印表機設定儲存到檔案中。

  • /Sr − 從檔案中恢復印表機設定。

  • /y − 將印表機設定為預設印表機。

  • /Xg − 獲取印表機設定。

  • /Xs − 設定印表機設定。

測試印表機是否存在

您可能連線到網路印表機而不是本地印表機。在這種情況下,在列印之前先檢查印表機是否存在始終是有益的。

可以使用RUNDLL32.EXE PRINTUI.DLL評估印表機是否存在,該程式用於控制大多數印表機設定。

示例

SET PrinterName = Test Printer
SET file=%TEMP%\Prt.txt
RUNDLL32.EXE PRINTUI.DLL,PrintUIEntry /Xg /n "%PrinterName%" /f "%file%" /q

IF EXIST "%file%" (
   ECHO %PrinterName% printer exists
) ELSE (
   ECHO %PrinterName% printer does NOT exists
)

上述命令將執行以下操作:

  • 它將首先設定印表機名稱並設定一個檔名,該檔名將儲存印表機的設定。

  • RUNDLL32.EXE PRINTUI.DLL命令將用於透過將檔案的配置設定傳送到Prt.txt檔案來檢查印表機是否實際存在。

批處理指令碼 - 除錯

當您處理大型複雜的批處理指令碼時,除錯批處理指令碼變得很重要。

以下是您可以除錯批處理檔案的方法。

使用echo命令

一個非常簡單的除錯選項是在您的批處理指令碼中儘可能多地使用echo命令。它將在命令提示符中顯示訊息,並幫助您調試出錯的地方。

這是一個簡單的示例,它根據給定的輸入顯示偶數。echo命令用於顯示結果以及輸入未給出時的結果。同樣,當您認為可能發生錯誤時,可以使用echo命令代替。例如,如果給定的輸入是負數、小於2等。

示例

@echo off  
if [%1] == [] ( 
   echo input value not provided 
   goto stop 
)  
rem Display numbers 
for /l %%n in (2,2,%1) do ( 
   echo %%n 
)  
:stop 
pause 

輸出

C:\>test.bat 
10 
2 
4 
6 
8 
10 
22
Press any key to continue ... 

使用pause命令

另一種方法是在發生錯誤時暫停批處理執行。當指令碼暫停時,開發人員可以修復問題並重新啟動處理。

在下面的示例中,由於輸入值是必需的且未提供,因此批處理指令碼已暫停。

示例

@echo off  
if [%1] == [] ( 
   echo input value not provided 
   goto stop 
) else ( 
   echo "Valid value"     
)  
:stop 
pause 

輸出

C:\>test.bat 
 input value not provided 
Press any key to continue.. 

將錯誤訊息記錄到另一個檔案

僅檢視命令提示符上顯示的一堆回顯來除錯錯誤可能會很困難。另一種簡單的解決方法是將這些訊息記錄到另一個檔案中,並逐步檢視它以瞭解出了什麼問題。

這是一個示例,請考慮以下test.bat檔案

net statistics /Server 

.bat檔案中給出的命令是錯誤的。讓我們記錄訊息並檢視我們得到什麼。

在您的命令列中執行以下命令

C:\>test.bat > testlog.txt 2> testerrors.txt

testerrors.txt檔案將顯示如下所示的錯誤訊息

The option /SERVER is unknown.  
The syntax of this command is:  
NET STATISTICS 
[WORKSTATION | SERVER]  
More help is available by typing NET HELPMSG 3506.

檢視上面的檔案,開發人員可以修復程式並再次執行。

使用ErrorLevel檢測錯誤並記錄錯誤

如果命令成功執行,Errorlevel 返回 0;如果命令失敗,則返回 1。

考慮以下示例

@echo off 
PING google.com  
if errorlevel 1 GOTO stop  
:stop 
   echo Unable to connect to google.com 
pause

在執行期間,您可以看到錯誤以及日誌

C:\>test.bat > testlog.txt

testlog.txt

Pinging google.com [172.217.26.238] with 32 bytes of data: 
Reply from 172.217.26.238: bytes=32 time=160ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=82ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=121ms TTL=111 
Reply from 172.217.26.238: bytes=32 time=108ms TTL=111  
Ping statistics for 172.217.26.238: 
   Packets: Sent = 4, Received = 4, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
   Minimum = 82ms, Maximum = 160ms, Average = 117ms
   Connected successfully 
Press any key to continue . . .

如果失敗,您將在 testlog.txt 中看到以下日誌。

Ping request could not find host google.com. Please check the name and try again. 
Unable to connect to google.com 
Press any key to continue . . .

批處理指令碼 - 日誌記錄

可以使用重定向命令在批處理指令碼中進行日誌記錄。

語法

test.bat > testlog.txt 2> testerrors.txt

示例

建立一個名為 test.bat 的檔案,並在檔案中輸入以下命令。

net statistics /Server

上述命令存在錯誤,因為 net statistics 命令的選項使用方法錯誤。

輸出

如果使用上述 test.bat 檔案執行命令為

test.bat > testlog.txt 2> testerrors.txt

並且您開啟檔案 testerrors.txt,您將看到以下錯誤。

The option /SERVER is unknown.

此命令的語法為:

NET STATISTICS
[WORKSTATION | SERVER]

鍵入 NET HELPMSG 3506 可獲得更多幫助。

如果您開啟名為 testlog.txt 的檔案,它將向您顯示已執行命令的日誌。

C:\tp>net statistics /Server
廣告