我有一个包含构建后事件的项目:
copy $(ProjectDir)DbVerse\Lunaverse.DbVerse.*.exe $(TargetDir)
每次在我的机器上都能正常工作。我有一个新的开发人员总是得到“退出代码1”错误。我让她在DOS提示符下运行相同的命令,它工作正常。可能是什么导致了这个?有没有办法解决真正的错误?
我们都在使用Visual Studio 2008。
答案 0 :(得分:110)
她的路径中有一个文件夹名称中有空格,周围没有引号。
答案 1 :(得分:57)
带有“Pings”的人帮助了我......但可能会更好一点解释......
对我而言,解决方案是改变:
copy $(TargetDir)$(TargetName).* $(SolutionDir)bin
到此:
copy "$(TargetDir)$(TargetName).*" "$(SolutionDir)bin"
希望它适合你。 : - )
答案 2 :(得分:44)
我对代码1的原因是目标文件夹是只读的。希望这有助于某人! 我有一个post build事件来从一个目录复制到另一个目录,目标是只读的。所以我只是去取消选中目录及其所有子目录的只读属性!只要确保它的目录是安全的!
答案 3 :(得分:41)
我已经为未来的访问者添加了这个,因为这是一个非常活跃的问题。
ROBOCOPY退出时“成功代码”低于8.请参阅:http://support.microsoft.com/kb/954404
这意味着:
robocopy exit code 0 = no files copied
robocopy exit code 1 = files copied
When the result is 1, this becomes an error exit code in visual studio.
所以我通过将其添加到批处理文件的底部
轻松解决了这个问题exit 0
建议以这种方式处理ROBOCOPY错误
rem each robocopy statement and then underneath have the error check.
if %ERRORLEVEL% GEQ 8 goto failed
rem end of batch file
GOTO success
:failed
rem do not pause as it will pause msbuild.
exit 1
:success
exit 0
当没有复制文件时,将设置混淆= VS中没有错误。然后,当有更改时,文件会被复制,VS错误,但开发人员想要的一切都已完成。
其他提示:不要在脚本中使用暂停,因为这会在VS版本中无限期暂停。在开发脚本时,请使用timeout 10
之类的内容。您会注意到这一点并将其注释掉,而不是悬挂构建。
答案 4 :(得分:11)
获取process monitor from SysInternals 将其设置为观察Lunaverse.DbVerse(在Path字段中)查看操作结果。 从那里出现什么问题应该很明显
答案 5 :(得分:7)
我必须以管理员身份运行VS才能将我的构建后副本发送到受操作系统保护的“.. \ Common7 \ IDE \ PrivateAssemblies”才能工作
答案 6 :(得分:5)
对于那些在构建事件中使用“复制”命令的人(预构建事件命令行或/和发布-build事件命令行)来自项目 - >属性:您的复制'命令参数应如下所示:copy "source of files" "destination for files"
。请记住使用引号(以避免地址字符串中的空格出现问题)。
答案 7 :(得分:3)
我能够通过运行Visual Studio作为管理员来修复我的代码1。显然,没有管理员,它无权执行shell命令。
答案 8 :(得分:3)
我有一个类似的问题,但特别是在Jenkins构建环境中。为了解决这个问题,我从使用后期构建事件中的复制命令切换到使用复制目标。
我改变了这个:
<PropertyGroup>
<PostBuildEvent>copy $(ProjectDir)bin\BLAH.Common.xml $(ProjectDir)App_Data\BLAH.Common.xml</PostBuildEvent>
</PropertyGroup>
到此:
<Target Name="AfterBuild">
<Copy SourceFiles="$(ProjectDir)bin\BLAH.Common.xml" DestinationFolder="$(ProjectDir)App_Data\" />
</Target>
现在工作正常。
我得到的具体错误是:
(PostBuildEvent target) ->
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(4291,5): error MSB3073: The command "copy <http://1.2.3.4/job/BLAHv2/ws/Api/bin/BLAH.Common.xml> <http://1.2.3.4/job/BLAHv2/ws/Api/App_Data/BLAH.Common.xml"> exited with code 1. [<http://1.2.3.4/job/BLAHv2/ws/Api/Api.csproj]>
答案 9 :(得分:2)
对我来说,我必须确保我正在复制文件的程序当时没有运行。语法中没有任何错误。希望这有助于某人。
答案 10 :(得分:2)
我刚收到同样的错误。我在目的地路径中有一个需要转义的%
c:\projects\%NotAnEnvironmentVariable%
需要
c:\projects\%%NotAnEnvironmentVariable%%
答案 11 :(得分:2)
作为一种良好做法,我建议您使用MS Build File Copy task替换post build事件。
答案 12 :(得分:2)
好的,这是许多解决方案的问题,所以我发布我的帖子给人们更多提示。 我的情况是仔细检查路径中的文件夹,并确保它们中的所有文件夹都存在于您的计算机中。例如:“$(SolutionDir)\ partBin \ Bin \ $(ProjectName).pdb”,但“Bin”不在partBin文件夹中。
答案 13 :(得分:2)
对于那些在Project中使用'copy'命令(预构建事件命令行或/和构建后事件命令行)的人 - &gt;属性:目标文件夹应该存在
答案 14 :(得分:0)
这么多解决方案......
在我的情况下,我必须使用非unicode(Western,Windows)编码保存bat文件。默认情况下,当我将文件添加到visual studio时(可能我应该在VS之外完成),它添加了UTF-8编码。
答案 15 :(得分:0)
我遇到了同样的问题,事实证明这是因为我重命名了这个项目。我进入项目属性并将程序集名称和根名称空间更改为项目名称,之后它运行良好!
答案 16 :(得分:0)
又一个答案......
就我而言,我有一个针对.Net Standard 1.3和.Net Framework 2.0的Visual Studio 2017项目。这在.csproj文件中指定如下:
<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>
我还有一个这样的post-build事件命令行:
copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"
换句话说,我试图将构建生成的.Net Framework .dll复制到另一个位置。
当我进行重建时,这个错误失败了:
MSB3073 The command "copy "E:\Yacks\YacksCore\YacksCore\bin\net20\Merlinia.YacksCore.dll" "E:\Merlinia\Trunk-Debug\Shared Bin\"" exited with code 1.
经过多次挫折之后,我终于确定发生的事情是Rebuild删除了所有输出文件,然后为.Net Standard 1.3进行了构建,然后尝试运行post-build事件命令行,因为文件失败了被复制还没有建成。
所以解决方案是改变构建的顺序,即首先构建.Net Framework 2.0,然后构建.Net Standard 1.3。
<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>
现在可以正常工作,有一个小故障,即后期构建事件命令行正在运行两次,因此文件被复制两次。
答案 17 :(得分:0)
就我而言,在调用bat文件之前,我必须cd
(更改目录),因为在bat文件中是一个复制操作,指定了相对路径。
:: Copy file
cd "$(ProjectDir)files\build_scripts\"
call "copy.bat"
答案 18 :(得分:0)