簡體   English   中英

為什么 Visual Studio 中的所有預生成或生成后事件都失敗並顯示退出代碼 1?

[英]Why do all Pre-build or Post-build events in Visual Studio fail with exit code 1?

我的目標是在解決方案 A 的構建后事件中將 .exe 文件從解決方案 A 的 bin 文件夾復制到另一個解決方案 B 資源文件夾。
我創建了必要的 xcopy 命令並在 powershell 中進行了嘗試:它運行良好。
每當我向 VS 構建中的操作添加任何命令時,都會失敗:“#command# exited with code 1”,例如,#command# 是 xcopy 命令。
我嘗試以管理員身份運行 VS,目前我嘗試運行一個包含“@echo off @exit 0”的 .bat 文件。 這也會導致“#command# 以代碼 1 退出”。

舉一些我作為 VS post/pre-build 命令嘗試過的例子:
調用“projdir\\test.bat”
調用 projdir\\test.bat
“projdir\\test.bat”
項目目錄\\test.bat
...我試過 projdir 作為“$(ProjectPath)”和手動路徑。

我將輸出放入詳細信息並發現以下內容:
命令“C:\\Users\\Traubenfuchs\\AppData\\Local\\Temp”寫入錯誤或找不到。 (那個文件夾確實存在,但我不知道它想做什么。)
當我在預/后構建中放置 xcopy 命令時,會發生同樣的事情。

有誰知道我做錯了什么?

在此處輸入圖片說明

最近我遇到了類似的問題。

關於您的“hello world”構建后事件:嘗試直接調用 powershell

powershell -command "write-output 'hello world'; exit 0"

==================

我的預構建事件如下所示:

powershell -file scriptPath.ps1

我的 scriptPath.ps1 看起來像:

<my epic powershell code>
...
exit 0

請注意,最后沒有“退出 0”,我從我的腳本中收到了返回代碼 1。

我們遇到這個問題是因為在域 GPO 中設置了“軟件限制策略”。 看起來 pre 和 post 構建在臨時文件夾中創建了一個 .cmd 批處理文件。 這是日志向我展示的內容:

cmd.exe (PID = 8456) 使用默認規則將 C:\\Users\\brian\\AppData\\Local\\Temp\\tmp733425d2c0604973a90a0a175c13353e.exec.cmd 識別為 Disallowed,Guid = {11015445-d282-64a2f2860

為了解決這個問題,我們修改了控制 SRP 的 GPO,使其不包含 .cmd 文件。 畢竟,SRP 的目標是阻止可執行惡意軟件,而不是批處理文件。 因此,我可能會遇到一些安全問題。 希望有人知道解決此問題的更好方法。

一個可能的問題是您必須使用$(ProjectDir)而不是$(ProjectPath)

當您使用$(ProjectPath)它實際上是: "C:\\Users\\....\\Project\\MyProject.csproj"

$(ProjectDir) ,它是: "C:\\Users\\....\\Project\\"

請注意,第一個版本實際上指向您的項目解決方案文件...這將導致一切失敗。

另一個是$(ProjectDir)自動將尾部斜杠添加到路徑中。 "$(ProjectDir)\\test.bat"實際上會轉換為: "C:\\Users\\....\\Project\\\\test.bat"

此外,您必須確保將所有文件路徑括在雙引號中

所以正確的調用應該是這樣的:

call "$(ProjectDir)test.bat"

其他需要檢查的事情是確保執行腳本的目錄是正確的。 請參閱 SO: visual studio 2012,postbuild 事件,bat 文件未創建新文件(未執行)

您是否查看過此 StackOverflow 中的建議? Post Build 退出,代碼為 1


編輯

嘗試這個:

echo Hello World
@exit 0

你需要用@exit 0結束任何命令,否則它認為它沒有正確完成


編輯 2

為什么我們使用@exit 0而不是exit 0 @Sunny 對 At 符號有很好的解釋 - @在這里

@ 符號告訴命令處理器不那么冗長; 只顯示命令的輸出而不顯示它正在執行或與執行相關的任何提示。 使用時,它被添加到命令的開頭,“@”和命令之間沒有必要留一個空格。

基本上,如果默認情況下call xyz.bat.bat文件中的每個命令都會與命令的實際輸出一起回顯。 例如:

測試.bat

echo Hello World
exit 0

將輸出:

C:\>call test.bat

C:\>echo Hello World
Hello World

C:\>exit 0

C:\>

當我們在命令前添加@時,我們只能得到命令本身的輸出。

測試2.bat

@echo Hello World
@exit 0

將輸出:

C:\>call c.bat
Hello World

C:\>

@echo off也是關閉腳本其余部分的一種方法。 我們通常這樣做只是為了使日志更易於閱讀,因為命令的文本會混淆日志輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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