我在VS 2010中发生了一个相对简单的构建后事件,只有两个复制操作。
复制操作的输出显示它们已成功,我检查了目录,文件副本工作正常。
VS告诉我构建失败但不告诉我原因......这是确切的输出:1>PostBuildEvent:
1> Description: Copying Library to Animation-Calibrator
1> 1 file(s) copied.
1>
1> -------------------------------------------------------------------------------
1> ROBOCOPY :: Robust File Copy for Windows
1> -------------------------------------------------------------------------------
1>
1> Started : Thu Jul 05 14:26:34 2012
1>
1> Source : C:\Users\Tag\Google Drive\Projects\TGAEngine\VS2010\obj\
1> Dest : C:\Users\Tag\Google Drive\Projects\Animation-Calibrator\lib\TGAEngine\obj\
1>
1> Files : *.*
1>
1> Options : *.* /S /COPY:DAT /R:1000000 /W:30
1>
1> ------------------------------------------------------------------------------
... List of files copied, no errors
1>
1> ------------------------------------------------------------------------------
1>
1> Total Copied Skipped Mismatch FAILED Extras
1> Dirs : 2 0 2 0 0 0
1> Files : 29 29 0 0 0 1
1> Bytes : 1.92 m 1.92 m 0 0 0 697
1> Times : 0:00:00 0:00:00 0:00:00 0:00:00
1>
1>
1> Speed : 100824150 Bytes/sec.
1> Speed : 5769.204 MegaBytes/min.
1>
1> Ended : Thu Jul 05 14:26:34 2012
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: The command "copy /y .\TGAEngine.lib .\..\..\Animation-Calibrator\lib\TGAEngine
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: robocopy /s ".\obj" ".\..\..\Animation-Calibrator\lib\TGAEngine\obj"
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppCommon.targets(113,5): error MSB3073: :VCEnd" exited with code 3.
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.11
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
我把它缩小到了robocopy命令
如果我做robocopy /s source dest
VS失败
如果我不使用参数'/ s',它不会失败,但文件不会被复制。
有什么想法吗?
我只是不发布脚本,因为我手动运行它并且没有任何错误。
答案 0 :(得分:10)
通常,如果成功,则进程返回exit status 0,如果失败,则返回非零值。
robocopy
似乎有一个非标准exit code definition:1也意味着成功; 0表示没有复制文件。如果你省略/s
,你现在看到为什么VS没有抱怨?
您的流程似乎退出状态3.请查看robocopy
的文档,如果这符合您的要求。对我来说,任何2或更大的值意味着麻烦。
如果出现错误,请自行检查退出代码,如果一切正常,则退出0(以下代码未经测试):
if ERRORLEVEL 2 goto HandleError
exit 0
:HandleError
exit %ERRORLEVEL%
答案 1 :(得分:1)
我发现了这个here
(robocopy /s source dest) ^& IF %ERRORLEVEL% LEQ 3 exit 0
它是krlmlr的简短版本,可以在一个命令行中运行。我认为错误级别3或以下是成功的,因为它是复制文件时的退出代码(退出代码1)并且目标中有额外的文件(退出代码2)。