![](/img/trans.png)
[英]How to access build warnings in a post-build event in Visual Studio?
[英]How to suppress initial post-build event error in Visual Studio 2017 (C#)?
我在 Visual Studio 2017 中有一個 C# 解決方案。我還有一個名為foobar.bat
的批處理腳本,其中包含以下代碼:
echo foobar : error 1: This is a test error.
我的目標是在構建特定項目時僅讓上面的測試錯誤消息出現在 Visual Studio 的錯誤列表中,並在它出現時停止構建。 所以我將[path to script]\foobar.bat
放在項目的構建后事件命令行中,然后構建。 現在我在 Visual Studio 錯誤列表中收到兩條錯誤消息:
The command "[path to script]\foobar.bat" exited with code -1.
This is a test error.
在這種情況下,看到僅打印出我的構建后事件內容的第一條錯誤消息沒有幫助。 我想抑制這個初始錯誤,以便只有我的自定義錯誤消息顯示在錯誤列表中(或者至少將其更改為更有用的內容)。
這是我嘗試過的:
2>nul
添加到我的批處理腳本的末尾沒有任何效果。1>nul
添加到我的批處理腳本的末尾會抑制這兩個錯誤,這不是我想要的。&set errorlevel=0
添加到我的批處理腳本的末尾沒有任何效果。exit 0
添加到我的批處理腳本的末尾沒有任何效果。<Target
Name="PostBuildEvent"
Condition="'$(PostBuildEvent)'!=''"
DependsOnTargets="$(PostBuildEventDependsOn)">
<Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>
最后一個選項幾乎讓我得到了我想要的。 但是,盡管有錯誤消息,但錯誤列表不會彈出,構建也不會失敗。 似乎任何會導致初始錯誤消息不出現的事情也會導致構建不再失敗。 是這樣嗎? 或者有什么方法可以讓構建失敗而不顯示初始錯誤消息?
您需要編輯 .csproj 文件並在上面最后一個要點中的Target PostBuildEvent
之后添加這些任務。
該解決方案的工作原理是獲取執行任務的ExitCode
和Output
,並使用它們觸發錯誤任務,然后該任務將停止構建並記錄消息。
Exec
任務需要三個參數:
IgnoreStandardErrorWarningFormat
和IgnoreExitCode
防止在這一步記錄錯誤ConsoleToMsBuild
參數(在 VS 2017 中拼寫為ConsoleToMSBuild
)。所以任務看起來像這樣:
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="$(PostBuildEvent)" IgnoreStandardErrorWarningFormat="true" IgnoreExitCode="true" ConsoleToMsBuild="true">
<Output TaskParameter="ConsoleOutput" PropertyName="OutputMessage" />
<Output TaskParameter="ExitCode" PropertyName="ExitCode" />
</Exec>
<Error Text="$(OutputMessage)" Condition="$(ExitCode) == 10" />
<!-- <Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 11" />
<Error Text="(optional text) : $(OutputMessage)" Condition="$(ExitCode) == 12" /> -->
</Target>
並編輯文件foobar.bat
:
echo foobar : error 1: This is a test error.
exit /b 10 <-- /b parameter needed if used in a .bat file
重要的部分是exit
,它將設置我們以后要使用的代碼。
您可以讓多個Error
任務對更多條件日志記錄執行操作,或者只使用原樣的輸出。
回復:將 &set errorlevel=0 添加到我的批處理腳本的末尾沒有任何效果。
要忽略單個命令的退出代碼,請使用 || 不是 & 或 &&。 例如
Robocopy || set errorlevel=0
這表示僅當 RoboCopy 以 errorlevel,= 0 退出時,設置 errorlevel=0
“&&”在這個批處理文件中做了什么?] 1解釋了這個和更多
歷史記錄單與號例如
(prog1 arg1 arg2) & (cmd2 arg1 arg2 arg3)
運行這兩個命令。 它在 DOS 中不是很有用。 在 Unix 中,它同時運行兩個命令(2 個進程),等待兩個命令完成。 由於 DOS 不支持多進程,“&”只是順序運行的語法糖。
單管道 prog1 | prog2 在 DOS 中受到同樣的限制。 在 Unix 中,在 prog1 在 stdout 上寫入適度數量后,prog2 可以在其 stdin 上使用它。
在 DOS 中,這是
prog1 > tmpFile
prog2 < tmpFile
在許多情況下,這已經足夠好了。 在 write1Meg | 的簡單情況下 head,(或更多)DOS 之前必須運行完成,head 可以在讀取第一個 10 行后退出。
做什么? Unix 還支持 & 在命令行 prog1 的末尾 & 這將啟動 prog1 並快速將控制權返回給控制台。
&& 和 || 僅當您知道退出代碼 0 被視為“真”且非零值被視為“假”時才有意義。 還完成了短路評估,因此檢查第一個退出代碼后的第二個命令。
prog1 && prog2
prog1 退出后,prog2 僅在 exitcode == 0 時運行
prog1 || prog2
prog1 退出后 prog2 僅在 exitcode != 0 時運行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.