2012/10/22

*.bat相關-1

1.Echo  
顯示訊息,或切換命令回應的開啟狀態。

  ECHO [ON | OFF]
  ECHO [message]

僅鍵入 ECHO 而不加上參數,可以顯示目前的 ECHO 設定。

2.@ 
表示不顯示@後面的命令。 
Sample:
@echo off 
@echo Now initializing the program,please wait a minute...  
@format X: /q/u/autoset 
(format 這個命令是不可以使用/y這個參數的,可喜的是微軟留了個
autoset這個參數給我們,效果和/y是一樣的。) 
 
3.Goto
將 cmd.exe 導向到批次程式裡標籤指定的位置。

GOTO label

  label   指定批次程式裡做為標籤名稱的文字字串。

標籤名稱必須單獨一行,並且以冒號開頭。

如果您啟用擴充命令,GOTO 命令的變更如下:

GOTO 命令接收到一個目標標籤: EOF,而此標籤會將控制
傳輸到目前批次指令檔的尾端。利用此簡單的方式,可不
必定義標籤便即離開批次指令檔。鍵入 CALL /? 以查看有關
CALL 擴充命令發揮此特性的描述。
 
4.Rem
在批次檔或 CONFIG.SYS 裡加上備註或說明。

REM [comment]
 
5.Pause
暫停執行批次程式,並且顯示以下訊息:
    請按任意鍵繼續 . . . 
Sample: 
@echo off  
:begin  
copy a:*.* d:\back  
echo Please put a new disk into driver A  
pause  
goto begin 
Driver A 中所有文件均複製到d:\back目錄下。顯示提示您將另一張磁片放入
Driver A 時,pause 命令會使程式暫停,以便更換磁,然後按任意鍵繼續處理。
 
6.Call
從批次程式中呼叫另一程式。

CALL [drive:][path]filename [batch-parameters]

  batch-parameters   指定批次程式所需要的命令列資訊。

如果您啟用擴充命令,CALL 命令的變更如下:

CALL 命令現在可以用標籤來當作 CALL 命令的目標。語法為:

    CALL :label arguments

這會用指定的 arguments 來建立一個新的批次檔檔案內容,而且控制權
會被傳到指定的 label 後的敘述。您必須經由達到批次指令檔的結尾兩
次來 "exit" 兩次。第一次您讀入批次檔結尾時,控制權會回到 CALL
描述的下一個敘述。而第二次則會結束批次檔的執行。請鍵入 GOTO /?
來獲得 GOTO :EOF 擴充命令的描述。 這個命令可以讓您從批次檔中
"return" 。

此外,批次檔參數的參考 (%0,%1 及其他) 已經做了如下的擴充:


    %* 在批次檔中,這代表所有的參數 (e.g. %1 %2 %3
        %4 %5 ...)

    批次參數的取代 (%n) 已經做了改進。  您現在可以選用下列的
    語法:

        %~1         - 展開 %1 且移除包圍的引號 (")
        %~f1        - 展開 %1 為一個完全符合的路徑名稱
        %~d1        - 只展開 %1 為磁碟機代號
        %~p1        - 只展開 %1 為路徑
        %~n1        - 只展開 %1 為檔名
        %~x1        - 只展開 %1 為副檔名
        %~s1        - 展開的路徑只包含短檔名
        %~a1        - 展開 %1 為檔案的檔案屬性
        %~t1        - 展開 %1 為檔案的日期/時間
        %~z1        - 展開 %1 為檔案的長度
        %~$PATH:1   - 搜尋所有列在 PATH 環境變數內的目錄且
                       展開 %1 為第一個找到的完全符合檔名。
                       如果沒有定義環境變數名稱或是搜尋找不
                       到檔案,則這個修飾元會展開成空字串。

    修正程式可合併使用,進而得到複合結果:

        %~dp1       - 只擴充 %1 到磁碟機代號和路徑
        %~nx1       - 只擴充 %1 到檔案名稱和副檔名
        %~dp$PATH:1 - 搜尋 %1 的 PATH 環境變數中所列的
                       目錄,並擴充至磁碟機代號和第一個
                       找到的路徑。
        %~ftza1     - 將 %1 擴充成 DIR ,和輸出行相同

    在上例中,%1 和 PATH 可被其他有效值取代。%~ 語法是
    以正確的引數數字作結尾。%~ 修正程式可能無法使用 %* 
 
7.Start
開始另一個視窗來執行指定的程式或命令。

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
      [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
      [/AFFINITY ] [/WAIT] [/B] [command/program]
      [parameters]

    "title"     要在視窗標題列顯示的標題。
    path        開始目錄
    B           啟動應用程式但不建立新視窗。含有 ^C 控制碼的應用程式會被略過,
                除非應用程式啟用 ^C 程序,否則 ^Break 是唯一可以中斷應用程式的
                方法
    I           新環境會使用傳遞給 cmd.exe 的原始環境,而不是目前的環境。
    MIN         視窗最小化
    MAX         視窗最大化
    SEPARATE    在不同的記憶體空間啟動 16 位元視窗程式
    SHARED      在共用的記憶體空間啟動 16 位元視窗程式
    LOW         在 IDLE 優先類別中啟動應用程式
    NORMAL      在 NORMAL 優先類別中啟動應用程式
    HIGH        在 HIGH 優先類別中啟動應用程式
    REALTIME    在 REALTIME 優先類別中啟動應用程式
    ABOVENORMAL 在 ABOVENORMAL 優先類別中啟動應用程式
    BELOWNORMAL 在 BELOWNORMAL 優先類別中啟動應用程式
    AFFINITY    新的應用程式將具有指定處理器的相關性遮罩,以十六進位數字表示。
    WAIT        啟動應用程式並等待其結束
    command/program
                如果這是內部 cmd 命令或批次檔,命令處理器會使用 /K 參數執行
                cmd.exe。這表示視窗會保持到命令執行完成。

                如果這不是內部 cmd 命令或批次檔,它就是一個程式,它會以視窗程式
                或主控台應用程式的執行方式執行。
    parameters      這些是傳遞給 command/program 的參數。

注意: SEPERATE 與 SHARED 選項不支援 64 位元平台。

如果您啟用擴充命令,經由命令列或 START 命令的外部命令執行有以下改變:

可以經由打入檔案名稱的命令來利用檔名連結以啟動非執行檔。(例如 WORD.DOC
    會執行和 .DOC 副檔名連結的程式)。請參看 ASSOC 及 FTYPE 命令來了解
    如何在指令檔案中建立這些檔案連結。

當執行 32 位元的圖形介面應用程式時,CMD.EXE 並不會等應用程式停止才回到
    命令提示。但是如果從指令檔中執行時,則不會有這樣的行為。

當執行一個命令列時,其中第一個字串項是字串 "CMD " 且沒有副檔名或路徑指
    示,則 "CMD" 會被 COMSPEC 環境變數的值所取代。這會避免由目前目錄中
    選擇 CMD.EXE

當執行一個命令列時,其中第一個字串項不包含副檔名時,則 CMD.EXE 使用
    PATHEXT 環境變數的值來決定尋找哪個副檔名及用什麼順序來尋找。PATHEXT
    變數的預設值為:

        .COM;.EXE;.BAT;.CMD

    請注意這個語法和 PATH 變數相同,且用分號來隔開不同的項目。

當尋找執行檔時,若是任何副檔名都不符合,則會試著尋找是否有符合的目錄名稱。
如果有的話,START 命令會在那個路徑執行檔案管理員。若是從命令列執行,這就相
當於執行 CD /D 到那個路徑。
 
8.choice
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

描述:
    這個工具可以讓使用者從一些選擇中
    選取一個項目,並將選取的選擇傳回索引。

參數清單:
   /C    choices       指定要建立的選擇清單。
                       預設清單是 "YN"。

   /N                  將選擇清單隱藏在提示中。
                       已經顯示提示之前的訊息,
                       選擇仍在啟用中。

   /CS                 啟用會區分英文大小寫 的選擇以供選取。
                       預設的情況是公用程式不會區分英文大小寫。

   /T    timeout       做出預設選擇之前
                       要暫停的秒數。可接受的值介於 0 到
                       9999。如果指定 0 的話,將不會暫停
                       並將選取預設選擇。

   /D    choice        在 nnnn 秒之後指定預設選擇。
                       字元必須在以  /C 選項所指定的選擇組之中,
                       而且必須以 /T 指定 nnnn。

   /M    text          指定出現在提示之前
                       的訊息。未指定的話,公用程式將只顯示
                       提示字元。

   /?                  顯示這個說明訊息。

   注意事項:
   ERRORLEVEL 環境變數應設成由選擇組中選
   取的機碼索引。列出的第一個選擇傳回值 1,
   第二個選擇傳回 2,以此類推。
   如果使用者按的機碼是無效的選擇,工具會
   發出警告的嗶聲。如果工具偵測出錯誤情況,
   則會傳回 ERRORLEVEL 值等於 255。如果使用
   者按 CTRL+BREAK 或 CTRL+C,工具將傳回 ERRORLEVEL 值等於 0。
   當您在批次程式中使用 ERRORLEVEL 參數時,
   請以遞減順序列出。

範例:
   CHOICE /?
   CHOICE /C YNC /M "按是(Y)、否(N)或取消(C)。"
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "參數 1 請選 a,參數 2 則選 b"。
   CHOICE /C ab /N /M "參數 1 請選 a,參數 2 則選 b"。
Sample:
choice /C YNC /M "按是(Y)、否(N)或取消(C)。"
if errorlevel==3 goto pC
if errorlevel==2 goto pN
if errorlevel==1 goto pY

:pY
echo press Y
goto :EOF

:pN
echo press N
goto :EOF

:pC
echo press C
goto :EOF


9.If
在批次檔中執行條件處理。

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  NOT               表示 Windows 應該只有在條件為偽時才執行命令。

  ERRORLEVEL number 當上一個執行的程式傳回的結束碼大於或等於指定
                    數字時,則條件為真。

  string1==string2  當指定的文字字串相符合時,則條件為真。

  EXIST filename    如果指定的檔名存在時,則條件為真。

  command           指定當條件為真時所要執行的命令。命令之後可以
                    接著 ELSE 命令。當指定條件為偽時,緊接在 ELSE
                    命令之後的命令將會被執行。

ELSE 子句必須出現在 IF 之後的同一行。例如:

    IF EXIST filename. (
        del filename.
    ) ELSE (
        echo filename. missing.
    )

以下命令無法作用,因為 del 命令必須以換行字元來結尾:

    IF EXIST filename. del filename. ELSE echo filename. missing

下面命令也無法作用,因為 ELSE 命令必須在與 IF 命令同一行的結尾:

    IF EXIST filename. del filename.
    ELSE echo filename. missing

下面命令只有在寫成一行時才能作用:

    IF EXIST filename. (del filename.) ELSE echo filename. missing

如果您啟用擴充命令,IF 的變更如下:

    IF [/I] string1 compare-op string2 命令
    IF CMDEXTVERSION 數字命令
    IF DEFINED 變數命令

compare-op 可以是:

    EQU - 等於
    NEQ - 不等於
    LSS - 小於
    LEQ - 小於或等於
    GTR - 大於
    GEQ - 大於或等於

而如果指定 /I 參數,則執行區分大小寫的字串比對。此 /I 參數也可使用
string1==string2 格式於 IF 命令。這些比對是通用的,因為在比對中,如
果 string1 及 string2 兩者皆由十進位數字所構成,則字串將會轉換為數
字,並執行數字的比對。

CMDEXTVERSION 條件式的運作和 ERRORLEVEL 一樣,除非它和與擴充命令相
關的內部版本編號作比對。第一個版本為 1。若擴充命令大幅度地增強時就
再加 1。當擴充命令停用時,CMDEXTVERSION 條件式永遠不為真。

DEFINED 條件式的運作和 EXISTS 一樣,除非它帶有環境變數名稱,如果環
境變數已定義則傳回 true 值。

%ERRORLEVEL% 將擴充到代表目前 ERRORLEVEL 變數的一個字串,前提是已
經沒有名為 ERRORLEVEL 的環境變數,在這個情況下,您會得到它的值。使
用此值和上面的數字比對運算元,您可以作下列的選擇:

    goto answer %ERRORLEVEL%
    :answer0
    提示您鍵入 Y 加以確定
    :answer1
    提示您鍵入N 加以否定

您也可使用上面的數字比對:

    IF %ERRORLEVEL% LEQ 1 goto okay

%CMDCMDLINE% 將擴充到比 CMD.EXE 的任何處理程序更早傳給 CMD.EXE 的
原始命令列,前提是已經沒有名為 CMDCMDLINE 的環境變數,在這個情形下,
您會得到它的值。

%CMDEXTVERSION% 將擴充成一個表示目前 CMDEXTVERSION 值的字串,
表示沒有名為 CMDEXTVERSION 的環境變數。這種情況下您將會得到它的值。
 
10.erroelevel
if errorlevel / if not errorlevel 數字  待執行的命令 
如果返回碼等指定的數字,則條件成立,運行命令,否則運行下一句。  
如if errorlevel 2 goto x2    
DOS程序運行時都會返回一個數字給DOS,稱為錯誤碼errorlevel或稱返回碼,常見的返回碼  
為0、1。   
 
11.For
對一組檔案中的每個檔案執行指定的命令。

FOR %variable IN (set) DO 命令 [command-parameters]

  %variable 指定一個可以取代的參數。
  (set)      指定由一或多個檔案組成的檔案組。您可使用通配字元。
  command    指定命令來執行每一個檔案。
 command-parameters
             為所指定的命令指定變數或參數。

如果要在批次程式中使用 FOR 命令,請指定 %%variable,而不要指定
%variable。  變數名稱有大小寫的區分,所以 %i 不同於 %I。

如果您啟用擴充命令,則額外支援下列的 FOR 命令
格式:

FOR /D %variable IN (set) DO command  [command-parameters]

    如果 set 中包含萬用字元,則指定與目錄
    名稱相符,而不是與檔案名稱相符。

FOR /R [[drive:]path] %variable IN (set) DO command  [command-parameters]

    在樹狀目錄中切換 [drive:]路徑,並於樹狀目錄的每一個目錄下執行
    FOR 陳述式。如果未在 /R 之後指定目錄規格,則採用目前的目錄。
    如果 set 只是單一句點 (.) 字元,則它只會列舉樹狀目錄結構。

FOR /L %variable IN (start,step,end) DO command [command-parameters]

    set 是從開頭到結尾一次跳一步的連續數字。所以 (1,1,5) 會產生
    連續值 (1 2 3 4 5) 而 (5,-1,1) 會產生連續值 (5 4 3 2 1)

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

    或,如果使用 usebackq 選項:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ('string') DO command [command-parameters]
FOR /F ["options"] %variable IN (`command`) DO command [command-parameters]

    filenameset 可以是一個以上的檔案名稱。每個檔案都已開啟,
    讀取及處理過,才繼續進行下個檔案名稱組。處理檔案讀取的一致
    性,將它分成獨立的文字行,然後將每一行分析成零或更多的字串。
    用已找到的字串值為變數值,來呼叫 For 迴圈的內容。預設狀態,
    /F 傳出每個檔案的每一行中,以空格分隔的第一個字串。空白行
    會被略過。您可以指定 "options" 參數來覆寫預設的分析行為。
    這是有引號的字串,包含一個以上的關鍵字,來指定不同的分析
    選項。關鍵字是:

        eol=c           - 指定一個行尾註解字元
                          (只有一個)
        skip=n          - 指定在檔案開頭要掠過的
                          行數。
        delims=xxx      - 指定分隔符號的集合。  這會取代
                          預設的空白與定位字元的分隔符號集合。
        tokens=x,y,m-n  - 指定每一行的哪些文字串應該被
                          傳到 for 的內部以用來進行每一個重複操作。
                          這會導致額外的變數名稱被配置。
                          m-n 格式代表一個範圍,
                          指定了第 m 個到第 n 個字串項。
                          如果在 tokens= 字串的最後一個字元是
                          星號,則會配置一個額外的變數
                          來接收最後一個字串項被分析後
                          的其他文字。
        usebackq        - 指定新語義開始作用。
                          其中反括號的字串會被當作命令來執行,
                          而單引號字串是純文字字串。
                          此外還允許使用雙引號來
                          引用在 filenameset 內
                          的檔名。

    以下是一個範例:

FOR /F "eol=; tokens=2,3 delims=, " %%i in (myfile.txt) do @echo %%i %%j %%k

    這會分析 myfile.txt 檔案中的每一行,它不會去管以分號開頭的行數
    ,直接將第 2 個及第 3 個語法從每一行傳到 for 主體,而其語法是
    用逗號和/或空格分開的(delims不放在最後即使條件有空格不會被納
    入分隔條件)。請注意,for 主體陳述式參照 %i 以取得第
    二個語法,參照 %j 以取得第三個語法,使用 %k 取得第三個語法之
    後的剩餘字串。因為檔案名稱含有空格,您必須用雙引號來括住檔案名
    稱。要這樣使用雙引號,您必須使用 usebackq 參數。否則雙引號會被
    解譯成用來定義一般文字。

    使用 %i 明白地在 for 陳述式中宣告,並透過 tokens= option 使用
    %j 作暗式性的宣告。您可以藉由 tokens= line 來指定最多 26 個語
    法,前提是它宣告的變數不能高於字母 'z' 或 'Z'。請記住,FOR 變
    數是單一字元的,同時在任一時間內,您不能同時使用超過 52 個 FOR
    變數。

    您也可以使用 FOR /F 命令在立即字串中分析邏輯,方法是將括弧之間的
    filenameset 變成一個引號字串。它會被視為從檔案輸入的單行,並加
    以分析。

    最後,您可以使用 FOR /F 命令來分析一個命令的輸出。方法是將括弧
    內的 filenameset 變成單引號字串。它將被視為一個命令列,這個命令
    行將會傳到子 CMD.EXE,而輸出將會被擷取到記憶體中,當成檔案來分
    析。所以下列的範例:

        FOR /F "delims==" %%i IN ('set') DO @echo %%i

    將列舉目前環境中的環境變數名稱。

此外,已經加強了 FOR 變數參考的取代功能。
您現在可以選用下列的語法:

    %~I         - 展開 %I 且移除包圍的引號 (")
    %~fI        - 展開 %I 為一個完全符合的路徑名稱
    %~dI        - 只展開 %I 為磁碟機代號
    %~pI        - 只展開 %I 為路徑
    %~nI        - 只展開 %I 為檔名
    %~xI        - 只展開 %I 為副檔名
    %~sI        - 展開的路徑只包含短檔名
    %~aI        - 展開 %I 為檔案的檔案屬性
    %~tI        - 展開 %I 為檔案的日期/時間
    %~zI        - 展開 %I 檔案的長度
    %~$PATH:I   - 搜尋所有列在 PATH 環境變數內的目錄
                   且展開 %I 為
                   第一個找到的完全符合檔名。
                   如果沒有定義環境變數名稱
                   或是搜尋找不到檔案,
                   則這個修飾元會展開為
                   空字串。

修飾元可以合併使用以獲得綜合的結果:

    %~dpI       - 只展開 %I 為磁碟機代號與路徑
    %~nxI       - 只展開 %I 為檔名與副檔名
    %~fsI       - 只展開 %I 為含短檔名的完全路徑
    %~dp$PATH:i - 為 %I 搜尋所有列在 PATH 環境變數內的目錄
                   且展開第一個找到的項目為磁碟機代號及
                   路徑。
    %~ftzaI     - 展開 %I 為像 DIR 一樣的輸出行

在上面的範例中 %I 和 PATH 能用其他的合法值取代。%~ 語法是由合法的
FOR 變數名稱來終止。如果選用像 %I 的大寫名稱可以增加可讀性而且避免
和修飾元的混淆,因為這些並不區分大小寫。 
 
12.Set
顯示、設定或移除 cmd.exe 環境變數。

SET [variable=[string]]

  variable  指定環境變數名稱。
  string    指定設定給變數的一系列字元。

僅鍵入 SET 而不加上任何參數,可以顯示目前的環境變數。

如果您啟用了擴充命令,SET 命令有以下的改變:

如果執行 SET 命令而且只包含變數名稱,沒有等號或數值的話,
命令會顯示出所有字首符合 SET 命令中指定變數名稱的所有變數
值。例如:

    SET P

會列出所有以 'P' 為開頭的環境變數。

如果在目前的環境中找不到變數名稱,SET 命令會將 ERRORLEVEL
設為 1。

SET 命令不將等號 (=) 視為變數名稱的一部份。

有兩個新參數已經加到 SET 命令中:

    SET /A expression
    SET /P variable=[promptString]

/A 指定在等號右方的字串是一個要被運算的數字運算式。您可以用運
算式進行簡單的運算,而且支援下列的運算子 (依照運算優先順序由高
到低排列):

    ()                  - 組成一群
    ! ~ -               - 一元運算符
    * / %              - 數字運算元
    + -                 - 數字運算元
    << >>               - 邏輯位移
    &                   - 位元運算 and
    ^                   - 位元運算 exclusive or
    |                   - 位元運算 or
    = *= /= %= += -=   - 指定
    &= ^= |= <<= >>=
    ,                   - 運算式分隔字元

如果您使用了任何邏輯或餘數運算子,您必須將運算式兩邊括上引號。
任何在運算式中非數字的字串會被當作環境變數,並且在使用前會先將
這些環境變數轉換為數字。如果您所指定的環境變數名稱尚未在目前環
境中定義,那麼它的值會被設為 0。這可以讓您用環境變數值來做運算
,而不必打入所有的 % 符號來取得它的值。如果 SET /A 是用指令檔
之外的命令列執行,它會顯示運算式最後的數值。指定運算子需要有個
環境變數在等號的左方。0x 字首在數字前方代表十六進位數字、0b 字
首代表二進位數字或 0 字首代表八進位數字,否則數字值都是指十進位
數字。所以 0x12 就和 18、022 等相同。請注意八進位數字可能容易
弄錯: 像 08 和 09 就不是正確的數字,因為 8 和 9 並不是八進位的
正確數字。

/P 參數讓您設定命令列的使用者輸入變數值。在讀取輸入命令列之前,
顯示指定的 promptString。promptString 可以是空白。

環境變數取代功能已經有下列增強:

    %PATH:str1=str2%

會將 PATH 環境變數展開,取代每個發現的 "str1" 與 "str2"的擴充結果。
"str2" 可以是空白字串,這會從擴充輸出中刪除全部 "str1"。"str1" 可以
用星號開始,這將會從擴充輸出的開頭開始,對應到從所有第一個發現含有
str1 的項目。

您也可以為擴充功能指定子字串。

    %PATH:~10,5%

這將會擴充 PATH 環境變數,然後只使用擴充結果的第 11 個(位移 10)字元
後的 5 個字元如果長度未指定,將會預設為上次使用的變數值。如果數字(位
移或長度)是負數,使用的數字將會是環境變數的長度加上位移或指定長度。

    %PATH:~-10%

將抽出 PATH 變數的最後 10 個字元。

    %PATH:~0,-2%

將抽出 PATH 變數的最後 2 個字元。

最後,系統加入了延遲環境變數展開的支援。在預設狀態下,命令展開會啟
用這項支援,但是您可以在 CMD.EXE 用 /V 命令列參數來啟用/停用這個功
能。 請參看 CMD /?

延遲環境變數展開功能可用來避開展開功能限制。這項限制是發生在命令列
讀取過程,不是發生在執行過程。下面的範例說明了立即展開變數時會發生
的問題:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after;
        if "%VAR%" == "after" @echo If you see this, it worked
    )

這個例子永遠無法顯示 echo 訊息,因為在兩個 IF 敘述中的 %VAR% 會
在第一個 IF 敘述被讀入時便被展開。這是因為它是邏輯上包含了 IF 的內
部,而內部又是一個複合敘述。  所以在複合敘述內的 IF 實際上是用
"before" 和 "after" 來比較,而這永遠不會為真。同樣的,下面的例子也
不會作用:

    set LIST=
    for %i in (*) do set LIST=%LIST% %i
    echo %LIST%

這個例子中並不會建立目前目錄中所有檔案的清單,相反的只會將 LIST 變
數設為最後一個找到的檔案。同樣地,這是因為 %LIST% 只有在 FOR 敘述
第一次被讀入時才展開,此時 LIST 變數是空的。所以我們實際執行的 FOR
迴圈是:

    for %i in (*) do set LIST= %i

這只是重複的將 LIST 設為最後找到的檔案。

延遲環境變數展開讓您可以用一個不同的字元 (驚嘆號) 在執行時展開
環境變數。如果啟用了延遲環境變數展開,上面的例子可以被改寫如下
而正常作用:

    set VAR=before
    if "%VAR%" == "before" (
        set VAR=after
        if "!VAR!" == "after" @echo If you see this, it worked
    )

    set LIST=
    for %i in (*) do set LIST=!LIST! %i
    echo %LIST%

如果您啟用了命令擴充,有幾個動態環境變數會被展開但是不會出現在 SET
所顯示的環境變數列表中。這些變數的值會每次在這些變數被展開時動態地
重新計算如果使用者用這些變數的名稱來定義變數時,則這個新定義會覆蓋
以下所列的動態變數:

%CD% - 展開為含目前目錄的字串。

%DATE% - 展開為與 DATE 命令格式相同的目前日期字串。

%TIME% - 展開為與 TIME 命令格式相同的目前時間字串。

%RANDOM% - 展開為一個在 0 和 32767 之間的整數亂數值。

%ERRORLEVEL% - 展開為目前的 ERRORLEVEL 值

%CMDEXTVERSION% - 展開為目前的命令處理擴充功能的版本號碼。

%CMDCMDLINE% - 展開為執行命令處理器前的原始命令列。 
 
13.cmd 
啟動一個 Windows 命令直譯器的新例項

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF]
    [[/S] [/C | /K] string]

/C      執行字串中所描述的命令然後結束命令視窗
/K      執行字串中所描述的命令然後保留命令視窗
/S      修改字串在 /C 或 /K (參看下方)
/Q      關閉 echo
/D      從登錄中停用 AutoRun 命令(參看下方)
/A      將內部命令輸出結果以 ANSI 格式導向 pipe 或檔案
/U      將內部命令輸出結果以 Unicode 格式導向 pipe 或檔案
/T:fg   設定幕前/幕後色彩 (參看 COLOR /?)
/E:ON   啟用命令延伸 (參看下方)
/E:OFF  停用命令延伸 (參看下方)
/F:ON   啟用檔案及目錄名稱完整字元(參看下方)
/F:OFF  停用檔案及目錄名稱完整字元(參看下方)
/V:ON   啟用延遲環境變數延伸,用 ! 作為分隔字元。例如, /V:ON
        可以讓 !var! 在執行時展開變數 var。文法 var 則會在
        輸入時展開變數,這在 FOR 迴圈之中是完全不同的事。
/V:OFF  停用延遲環境變數展開

請注意用命令分隔字元 '&&' 隔開的多個命令如果被引號包含時則會
被當成字串來接受。此外,為了相容性的原因,/X 的作用與 /E:ON
相同; /Y 與 /E:OFF 相同且 /R 與 /C 相同。其餘的參數則會被忽
略。

如果指定了/C 或 /K,則在參數後的其餘命令列會被當成命令列來處
理,其中使用下面的邏輯來處理引號字元 (") :

    1.  如果所有下列條件都符合,那麼命令列上的引號會被保留:

        - 沒有 /S 參數
        - 正好有兩個引號
        - 在兩個引號之間沒有下列特殊字元: <>()@^|
        - 兩個引號之間有一些空格
        - 在兩個引號之間的字串是執行檔的檔案名稱。

    2.  否則,如果第一個字元是引號,舊的命令列會把前置字元去
        掉,並將命令列中第一個引號及最後一個引號之間的所有文
        字變成保留文字。

如果您在命令列中未指定 /D,當 CMD.EXE 起動後,
它會尋找下列 REG_SZ/REG_EXPAND_SZ的 登錄變數。如果
有一個存在或兩個都存在,命令會執行第一個變數。

HKEY_LOCAL_MACHINE\Software\Microsoft\CommandProcessor\AutoRun

及/或

HKEY_CURRENT_USER\Software\Microsoft\CommandProcessor\AutoRun

將命令擴充功能預設成啟用狀態。您可以在特定的呼叫中,用 /E:OFF
參數來停用擴充功能。您可以啟用或停用一台電腦上或使用者登入工作
階段中所有 CMD.EXE 呼叫的擴充功能,如果您要這樣作,請使用
REGEDIT.EXE 來設定以下的 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\EnableExtensions

        及/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\EnableExtensions

到 0x1 或 0x0。使用者指定設定的執行優先順序高於電腦上的設定。命令
列參數的執行優先順序高於登錄中的設定值。


擴充命令包括下列命令的變更及(或)新增:

    DEL or ERASE
    COLOR
    CD or CHDIR
    MD or MKDIR
    PROMPT
    PUSHD
    POPD
    SET
    SETLOCAL
    ENDLOCAL
    IF
    FOR
    CALL
    SHIFT
    GOTO
    START (也包括援用外部命令之變更)
    ASSOC
    FTYPE

請鍵入 HELP 命令名稱,以查閱說明。

預設狀態下,不會啟用延遲環境變數擴充。您可以使用 /V:ON 或 /V:OFF 參數在
執行 CMD.EXE 時啟用或停用延遲擴充。您也可以用 REGEDIT.EXE 來修改以下
REG_DWORD 值,來啟用或停用整個電腦上或使用者登入工作階段中所有 CMD.EXE
的檔案名稱完整功能:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion

        及/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion

其值可為 0x1 或 0x0。使用者指定設定的優先順序高於電腦設定。命令列參數
優先順序高於登錄設定值。

如果已啟用延遲環境變數擴充,驚嘆號字元會在執行時被用來取代環境變數值。

您可以為特定的 CMD.EXE 呼叫,以 /F:ON 或 /F:OFF 開關啟用或停用檔案
名稱完成。 您可以啟用或停用在同一部電腦上所有 CMD.EXE 的呼叫完成
及/或使用者登入工作階段。方法是使用 REGEDIT.EXE 設定其一或兩者登錄
中的 REG_DWORD 值:

    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\CompletionChar
    HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\PathCompletionCha

        及/或

    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\CompletionChar
    HKEY_CURRENT_USER\Software\Microsoft\Command Processor\PathCompletionChar

用於特定功能的控制字元十六進位值 (例如 0x4 是 Ctrl-D 以及 0x6 是
Ctrl-F)。使用者指定設定的執行優先順序高於電腦上的設定。命令列參數
的執行優先順序高於登錄中的設定值。

如果以 /F:ON 開關啟用完成,則用於目錄名稱完成的控制字元是 Ctrl-D
而用於檔案名稱完成的控制字元是 Ctrl-F。如果您要停用在登錄中的特定
完成字元,請使用空間值 (0x20),因為它不是正確的控制字元。

當您鍵入其中一個控制字元後,完成功能會被啟動。如果路徑字串已存在,
而且所建立的路徑清單也符合的話,完成函數會讀取到指標所在左方為止
的路徑字串。然後它會顯示第一個符合的路徑。如果找不到符合的路徑,
它會發出嗶聲並保留顯示。如果您重覆按相同的控制字元,它將在符合的路
徑清單中循環執行。如果您同時按下 Shift 鍵與控制字元,可在清單中反
向移動。如果您進行編輯後再按控制字元的話,已儲存的符合路徑清單會被
丟棄,並建立新的清單。如果您在檔案及目錄完成功能之間切換,會有同樣
的情況發生。這兩個控制字元不同之處是:檔案完成字元可同時對應檔案及
目錄名稱,而目錄完成字元只能對應目錄名稱。如果您將檔案完成功能用在
內建目錄命令上 (CD,MD 或 RD) 也等於使用了目錄完成功能。

如果您在路徑字串兩端加上引號,完成功能鍵就可正確處理包含空格或其他
特殊字元的檔案名稱。還有,如果您備份後,又在命令列中呼叫完成功能的
話,已呼叫過完成功能的指標右方的文字會被丟棄。

要求加上引號的特殊字元有:
     
     &()[]{}^=;!'+,`~

沒有留言: