Robocopy在成功時輸出1,與大多數在成功時以0退出的程序不同。 Visual Studio(和MSBUILD)將退出代碼1解釋爲錯誤。在Visual Studio 2010中使用robocopy後生成和預生成事件
Robocopy如何在Visual Studio後期和預先構建事件中使用,以使構建環境正確識別失敗和成功?
注意:這或多或少是this post的轉貼。
Robocopy在成功時輸出1,與大多數在成功時以0退出的程序不同。 Visual Studio(和MSBUILD)將退出代碼1解釋爲錯誤。在Visual Studio 2010中使用robocopy後生成和預生成事件
Robocopy如何在Visual Studio後期和預先構建事件中使用,以使構建環境正確識別失敗和成功?
注意:這或多或少是this post的轉貼。
MSBuild extensionpack包含的Robocopy任務你可以在你的構建過程中使用。
這可以成爲你的解決方案,而不是VS前/後生成事件?
如果是這樣,你可以extend the Visual Studio Build Process通過覆蓋BeforeBuild,AfterBuild目標和調用的Robocopy任務(可以覆蓋其他的目標,以及他們是否會滿足您的需求更好的,請參閱鏈接的MSDN頁面列表)
所以其實你應該下載並安裝的MSBuild extensionpack比打開你的項目的csproj/vbproj文件並編輯以下方式:
添加以下條目進口的MSBuild extensionpack的任務的Robocopy
<PropertyGroup>
<TPath>$(MSBuildExtensionsPath32)\ExtensionPack\4.0\MSBuild.ExtensionPack.tasks</TPath>
</PropertyGroup>
<Import Project="$(TPath)"/>
重寫BeforeBuild,AfterBuild和執行任務的Robocopy
<Target Name="BeforeBuild">
<Message Text="Beforebuild" />
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:\temp\robo_src1" Destination="C:\temp\robo_dest1" Files="*.*" Options="/MIR">
<Output TaskParameter="ExitCode" PropertyName="Exit" />
<Output TaskParameter="ReturnCode" PropertyName="Return" />
</MSBuild.ExtensionPack.FileSystem.RoboCopy>
<Message Text="ExitCode = $(Exit)"/>
<Message Text="ReturnCode = $(Return)"/>
</Target>
<Target Name="AfterBuild">
<MSBuild.ExtensionPack.FileSystem.RoboCopy Source="C:\temp\robo_src2" Destination="C:\temp\robo_dest2" Files="*.*" Options="/MIR">
<Output TaskParameter="ExitCode" PropertyName="Exit" />
<Output TaskParameter="ReturnCode" PropertyName="Return" />
</MSBuild.ExtensionPack.FileSystem.RoboCopy>
<Message Text="ExitCode = $(Exit)"/>
<Message Text="ReturnCode = $(Return)"/>
</Target>
隨着<SRC>,<TGT>爲複製源和目標恭恭敬敬,並<選擇>是ROBOCOPY選項:
robocopy <opt> <src> <tgt>
set rce=%errorlevel%
if not %rce%==1 exit %rce% else exit 0
舉例來說,如果我們希望該項目的目標複製到C:\溫度,不重試,並與所有子目錄(空或沒有),我們會使用:
robocopy /R:0 /E $(TargetDir) c:\temp
set rce=%errorlevel%
if not %rce%==1 exit %rce% else exit 0
你也可以簡單地使用'如果errorlevel 1 exit 0 else exit%errorlevel%' – mafu 2011-10-12 09:43:48
@mafutrct:Wunderbar!如果你添加了你的評論作爲答案,我會upvote它。 – 2012-03-01 00:21:47
@mafutrct不! '如果errorlevel 1 ...'表示「如果錯誤大於或等於1」。換句話說,這會捕獲所有錯誤,但不會「不需要複製」(robocopy的0退出代碼)。但是,我認爲你需要'如果%errorlevel%leq 1 exit 0 else exit%errorlevel%'。 – skrebbel 2012-10-31 10:27:34
添加每個請求的這個答案。基於Asaf的解決方案,並添加skrebbel的評論。
可以簡化檢查:
robocopy <opt> <src> <tgt>
if %errorlevel% leq 1 exit 0 else exit %errorlevel%
正如評論指出好心,你可能需要調整「1」:這取決於你的操作應該當作一個錯誤。看看the meaning of the bits that in combination make up the number returned by robocopy:
0×10嚴重錯誤。 Robocopy沒有複製任何文件。這是 使用錯誤或由於源或目標目錄上的訪問權限不足導致的錯誤。
0×08某些文件或目錄無法複製(出現複製錯誤 並超出重試限制)。進一步檢查這些錯誤 。
0×04檢測到一些不匹配的文件或目錄。檢查 輸出日誌。家務管理可能是必要的。
0×02檢測到一些額外的文件或目錄。檢查輸出 日誌。一些家務管理可能是需要的。
0×01成功複製一個或多個文件(即新文件 已到達)。
0×00沒有發生錯誤,也沒有進行復制。目標目錄樹和目標目錄樹完全同步。
其實只有大於7(8以上)的值才表示失敗,請參見我的回答 – 2016-06-20 15:42:08
謝謝@OhadSchneider,我已經編輯了答案以澄清此問題 – mafu 2016-06-20 22:34:20
檢查的1退出代碼是不正確,因爲any exit code below 8 is non-erroneous:
任何大於8的值表明有在複製操作過程中的至少一個發生故障 。
(只是爲了澄清,8退出代碼是一個錯誤,以及:Several files did not copy
)
正確的代碼,那麼,應該是這樣的:
IF %ERRORLEVEL% GEQ 8 exit 1
exit 0
這應該被接受的答案! – nawfal 2016-06-20 13:57:00
語法上這裏是一個一行一行的版本,可直接在PreBuild步驟中使用:
(robocopy "$(ProjectDir)..\Dir1" "$(ProjectDir)Dir1" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1
(robocopy "$(ProjectDir)..\Dir2" "$(ProjectDir)Dir2" "Match.*" /a+:R) ^& IF %ERRORLEVEL% GEQ 8 exit 1
exit 0
參考文獻:
您可以請解釋如何添加它s.t.它有相同的目的嗎? – 2011-03-29 10:29:17
抱歉,代碼被截斷了我對編輯器不是很熟悉..我正在嘗試理清如何正確添加代碼 – 2011-03-29 11:13:56
我編輯了它。請確認這是你的意思。 – 2011-03-29 11:21:52