簡體   English   中英

如何抑制 Visual Studio 2017 (C#) 中的初始生成后事件錯誤?

[英]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 錯誤列表中收到兩條錯誤消息:

  1. The command "[path to script]\foobar.bat" exited with code -1.
  2. This is a test error.

在這種情況下,看到僅打印出我的構建后事件內容的第一條錯誤消息沒有幫助。 我想抑制這個初始錯誤,以便只有我的自定義錯誤消息顯示在錯誤列表中(或者至少將其更改為更有用的內容)。

這是我嘗試過的:

  • 2>nul添加到我的批處理腳本的末尾沒有任何效果。
  • 1>nul添加到我的批處理腳本的末尾會抑制這兩個錯誤,這不是我想要的。
  • &set errorlevel=0添加到我的批處理腳本的末尾沒有任何效果。
  • 將行exit 0添加到我的批處理腳本的末尾沒有任何效果。
  • 將以下內容添加到 my.csproj 文件的末尾(根據這篇文章)抑制了第一個錯誤,但使構建不再失敗:
<Target
    Name="PostBuildEvent"
    Condition="'$(PostBuildEvent)'!=''"
    DependsOnTargets="$(PostBuildEventDependsOn)">
    <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" IgnoreExitCode="true" />
</Target>

最后一個選項幾乎讓我得到了我想要的。 但是,盡管有錯誤消息,但錯誤列表不會彈出,構建也不會失敗。 似乎任何會導致初始錯誤消息不出現的事情也會導致構建不再失敗。 是這樣嗎? 或者有什么方法可以讓構建失敗而不顯示初始錯誤消息?

您可以做的是一起使用execerror任務。

您需要編輯 .csproj 文件並在上面最后一個要點中的Target PostBuildEvent之后添加這些任務。

該解決方案的工作原理是獲取執行任務的ExitCodeOutput ,並使用它們觸發錯誤任務,然后該任務將停止構建並記錄消息。
Exec任務需要三個參數:

  • IgnoreStandardErrorWarningFormatIgnoreExitCode防止在這一步記錄錯誤
  • 獲取輸出需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM