天天看點

【批處理學習筆記】第四課:簡單批處理指令(3)

call 指令

  CALL指令可以在批處理執行過程中調用另一個批處理,當另一個批處理執行完後,再繼續執行原來的批處理

CALL command

調用一條批處理指令,和直接執行指令效果一樣,特殊情況下很有用,比如變量的多級嵌套,見教程後面。在批處理程式設計中,可以根據一定條件生成指令字元串,用call可以執行該字元串,見例子。

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

調用的其它批處理程式。filename 參數必須具有 .bat 或 .cmd 擴充名。

CALL :label arguments

調用本檔案内指令段,相當于子程式。被調用的指令段以标簽:label開頭

以指令goto :eof結尾。

另外,批腳本文本參數參照(%0、%1、等等)已如下改變:

     批腳本裡的 %* 指出所有的參數(如 %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 - 在列在 PATH 環境變量中的目錄裡查找 %1,并擴充到找到的第一個檔案的驅動器号和路徑。

         %~ftza1     - 将 %1 擴充到類似 DIR 的輸出行。

    在上面的例子中,%1 和 PATH 可以被其他有效數值替換。%~ 文法被一個有效參數号碼終止。%~ 修定符不能跟 %*使用注意:

參數擴充時不理會參數所代表的檔案是否真實存在,均以目前目錄進行擴充要了解上面的知識,下面的例子很關鍵。

例:

@echo off

Echo 産生一個臨時檔案 > tmp.txt

Rem 下行先儲存目前目錄,再将c:\windows設為目前目錄

pushd c:\windows

Call :sub tmp.txt

Rem 下行恢複前次的目前目錄

Popd

pause

Del tmp.txt

exit

:sub

Echo 删除引号: %~1

Echo 擴充到路徑: %~f1

Echo 擴充到一個驅動器号: %~d1

Echo 擴充到一個路徑: %~p1

Echo 擴充到一個檔案名: %~n1

Echo 擴充到一個檔案擴充名: %~x1

Echo 擴充的路徑指含有短名: %~s1

Echo 擴充到檔案屬性: %~a1

Echo 擴充到檔案的日期/時間: %~t1

Echo 擴充到檔案的大小: %~z1

Echo 擴充到驅動器号和路徑:%~dp1

Echo 擴充到檔案名和擴充名:%~nx1

Echo 擴充到類似 DIR 的輸出行:%~ftza1

Echo.

Goto :eof

set aa=123456

set cmdstr=echo %aa%

call %cmdstr%

本例中如果不用call,而直接運作%cmdstr%,将顯示結果%aa%,而不是123456

繼續閱讀