Answers:
我已经为以后的访客添加了此功能,因为这是一个非常积极的问题。
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
。您将注意到这一点并注释掉它,而不是将其挂起。
代码1的原因是目标文件夹是只读的。希望这对某人有帮助!我有一个构建后事件,可以从一个目录复制到另一个目录,并且目标是只读的。因此,我只是去掉了目录及其所有子目录上的只读属性!只要确保它是安全的目录即可!
针对这一情况,谁使用“ 副本在”命令生成事件(预生成事件命令行或/和生成后事件命令行的)项目- >属性:你“ 复制 ”命令参数应该像在这里:copy "source of files" "destination for files"
。请记住使用引号(以避免地址字符串中的空格出现问题)。
我有一个类似的问题,但特别是在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]>
我遇到了同样的问题,事实证明那是因为我已重命名了该项目。我进入了项目属性,将Assembly Name和Root Namespace更改为项目名称,此后效果很好!
另一个答案...
就我而言,我有一个针对.Net Standard 1.3和.Net Framework 2.0的Visual Studio 2017项目。这是在.csproj文件中指定的,如下所示:
<TargetFrameworks>netstandard1.3;net20</TargetFrameworks>
我也有一个类似构建后的事件命令行:
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进行了构建,然后尝试运行构建后事件命令行,该命令行失败,因为要复制文件还没有建成。
因此,解决方案是更改构建顺序,即先构建.Net Framework 2.0,然后构建.Net Standard 1.3。
<TargetFrameworks>net20;netstandard1.3</TargetFrameworks>
现在可以正常工作,并且有一点小故障,即构建后事件命令行运行了两次,因此文件被复制了两次。