當我在不是 MSVC 開發命令 shell 的 cmd.exe 中運行它時,我的批處理檔案過早終止。
msbuild /version | find "Microsoft (R) Build Engine version 16" >nul
echo did I get here?
if errorlevel 1 goto no_msbuild
我從來沒有到達這if errorlevel
條線,所以我添加了這echo did I get here?
條線,我也不明白。
這是我運行 .bat 檔案時的輸出(我洗掉了@echo off):
Wed 09/07/2022 10:37:49
D:\temp> msbuild /version | find "Microsoft (R) Build Engine version 16" 1>nul
'msbuild' is not recognized as an internal or external command,
operable program or batch file.
Wed 09/07/2022 10:37:49
D:\temp>
當我在 VS2019 cmd shell(如果 errorlevel 1 測驗為假,即 errorlevel 為 0,所以 find 有效)和 VS2008 cmd(如果 errorlevel 1 為真,則 find 失敗)中運行它時,它作業正常
編輯:我消除了整個 msbuild 命令/路徑問題,合并了@mofi 可能的解決方案,并提出了以下內容:
xyzzy 2>nul | find "abc"
echo hello
if errorlevel 1 goto no_xyzzy
.bat 檔案仍然會過早終止,并且永遠不會echo hello
使用 stderr 重定向到 nul 執行偶數。
uj5u.com熱心網友回復:
讓我試著簡化一下。
xyzz | find...
正在管道stdout
到xyzz
。find
但是,xyzz
不存在,因此沒有stdout
或stderr
流,因此它將終止。cmd
但是會產生9009
錯誤級別,但您沒有請求stdout
或stderr
來自cmd
,您請求它是xyzz
因為您通過管道將其發送到find
為了證明這一點,我們可以消除find
xyzz 2>nul
if errorlevel 1 echo Failed
echo %errorlevel%
這將導致一個結果Failed
。
但是,我們可以將命令括起來并將塊通過管道傳輸到find
.
(xyzz 2>nul) | find "abc"
if errorlevel 1 echo Failed
echo %errorlevel%
首先注意,errorlevel
is now1
和 not 9009
,不是因為9009
不存在,而是存在于括號內,而是find
覆寫errorlevel
然后,這個作業的原因是因為整個代碼塊被重定向到find
,這也意味著cmd
結果,整個塊不會失敗,只會失敗xyzz
并且塊的執行完成,但是現在find
沒有滿足查詢并且引起errorlevel 1
您可以通過簡單地運行來縮短此測驗:
xyzz 2>nul | find "abc" && echo success || echo failed
對比
(xyzz 2>nul) | find "abc" && echo success || echo failed
最后一件事。.bat
是的舊擴展,它處理錯誤級別與新擴展batch-files
略有不同。.cmd
所以寧愿使用新常態。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507897.html
上一篇:=未被批量讀取
下一篇:如何組織檔案夾中的檔案