为什么Visual Studio中的所有预构建或后构建事件都会因退出代码1而失败?

时间:2014-07-30 08:37:55

标签: visual-studio batch-file powershell

我的目标是将.exe文件从解决方案A的bin文件夹复制到解决方案A的post build事件上的另一个解决方案B资源文件夹。
我创建了必要的xcopy命令并在powershell中进行了尝试:它完美无缺 每当我向VS中的操作添加任何命令时,都会失败:"#command#exited with code 1",其中#command#例如是xcopy命令。
我尝试以管理员身份运行VS,目前我尝试运行一个包含" @echo off @exit 0"的.bat文件。这也导致"#命令#退出代码1"。

举一些我作为VS post / pre-build命令尝试的例子:
打电话" projdir \ test.bat"
打电话给projdir \ test.bat
" PROJDIR \ test.bat的"
projdir \ test.bat
...我试过projdir作为" $(ProjectPath)"和手动路径。

我把输出放到verbose并找到以下内容:
命令" C:\ Users \ Traubenfuchs \ AppData \ Local \ Temp"写得不正确或无法找到。 (该文件夹实际存在,但我不知道它想要做什么。)
当我在前/后构建中放置xcopy命令时,会发生同样的事情。

谁知道我做错了什么?

enter image description here

3 个答案:

答案 0 :(得分:5)

最近我遇到了类似的问题。

关于你的"你好世界"后期制作活动:  尝试直接调用powershell

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

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

我的预构建活动如下:

powershell -file scriptPath.ps1

我的scriptPath.ps1如下所示:

<my epic powershell code>
...
exit 0

请注意,没有&#34;退出0&#34;最后,我从我的剧本中收到了返回码1。

答案 1 :(得分:5)

由于在域GPO中设置了“软件限制策略”,我们遇到了此问题。似乎pre和post版本在temp文件夹中创建.cmd批处理文件。以下是日志记录显示的内容:

  确定了

cmd.exe(PID = 8456)   C:\ Users \用户布莱恩\应用程序数据\本地的\ Temp \ tmp733425d2c0604973a90a0a175c13353e.exec.cmd   如果不允许使用默认规则,Guid =   {11015445-d282-4f86-96a2-9e485f593302}

为了解决这个问题,我们修改了控制SRP的GPO,使其不包含.cmd文件。毕竟,SRP的目标是阻止可执行的恶意软件,而不是批处理文件。因此,我可能会得到一些安全反击。希望有人知道解决这个问题的更好方法。

答案 2 :(得分:2)

一个可能的问题是您必须使用$(ProjectDir)而不是$(ProjectPath)

当您使用$(ProjectPath)时,实际上是:"C:\Users\....\Project\MyProject.csproj"

$(ProjectDir)对比"C:\Users\....\Project\"

请注意,第一个版本实际上是指向您的项目解决方案文件...这将导致一切失败。

另一个是$(ProjectDir)自动将尾部斜杠添加到路径中。即"$(ProjectDir)\test.bat"实际上会转换为:&#34; C:\ Users .... \ Project \ test.bat&#34;

此外,您必须确保将所有文件路径用双引号括起来

所以正确的电话会是这样的:

call "$(ProjectDir)test.bat"

要检查的其他事项是确保脚本正在执行的目录是正确的。见SO:visual studio 2012, postbuild event, bat file not creating new file (not executing)

您是否查看了此StackOverflow中的建议? Post Build exited with code 1


修改

试试这个:

echo Hello World
@exit 0

您需要使用@exit 0结束任何命令,否则它不会认为它已正确完成