[英]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.