我有 test1.bat、test2.bat、test3.bat,內容如下:
echo %0
我有 test.bat 因此:
test1.bat > t1 && test2.bat > t2 && test3.bat > t3
echo done with test?.bat invocation
set /p t1=<t1
set /p t2=<t2
set /p t3=<t3
del t1 t2 r3
echo %t1% %t2% %t3%
echo done
這將導致沒有顯示任何 echo 陳述句,但是,會創建檔案 t1、t2 和 t3。它們不會被洗掉。
uj5u.com熱心網友回復:
這有效:
test1.bat > t1 && test2.bat > t2 && test3.bat > t3
當改為
call test1.bat > t1 && call test2.bat > t2 && call test3.bat > t3
雖然,我不確定為什么呼叫陳述句真的是必要的。我想我有第二個問題,當我不使用 call 陳述句時會發生什么?
uj5u.com熱心網友回復:
除非您call用來運行另一個批處理檔案,否則當被呼叫的批處理檔案完成時,執行控制不會回傳到呼叫的批處理檔案。這解釋了為什么不執行腳本的后續命令。
您的情況有點棘手,因為您從單個命令列運行多個批處理檔案:
test1.bat > t1 && test2.bat > t2 && test3.bat > t3
現在當一個批處理檔案被執行時,它不是作為一個整體存盤在記憶體中,而是從批處理檔案中讀取每一行然后緩沖。在決議程序中,第一件事是標記化和重定向處理,其中&&和>被識別1。
正如您似乎知道的那樣,該&&運算子僅在前一個命令成功時才允許執行以下命令,這意味著其退出代碼為零。
現在全緩沖的行開始執行,但是由于缺少 ,執行控制權不會回傳給呼叫者,因此也不會回傳被呼叫者call的退出代碼,因此所有三個子腳本都會無條件地一個接一個運行。
實驗
下面的實驗說明了以上要求的內容。
將test?.bat一個命令放入每個檔案中@exit /B #,并#用檔案名?減去一的數字替換(例如test1.batcontains @exit /B 0)。
然后執行:
test1.bat > t1 && test2.bat > t2 && test3.bat > t3
將有三個檔案t1,2和t3,回傳的退出代碼無法識別。
現在執行:
call test1.bat > t1 && call test2.bat > t2 && call test3.bat > t3
只有兩個檔案t1和t2,回傳的退出代碼確實被識別。
1) 有關詳細資訊,請參閱此綜合執行緒:Windows 命令解釋器 (CMD.EXE) 如何決議腳本?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/376738.html
標籤:批处理文件
上一篇:批量檢查主機名是否有效
下一篇:不能在批量剝離中使用轉義字符
