2011-03-29 94 views

回答

4

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> 
+0

您可以請解釋如何添加它s.t.它有相同的目的嗎? – 2011-03-29 10:29:17

+0

抱歉,代碼被截斷了我對編輯器不是很熟悉..我正在嘗試理清如何正確添加代碼 – 2011-03-29 11:13:56

+0

我編輯了它。請確認這是你的意思。 – 2011-03-29 11:21:52

19

隨着<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 
+9

你也可以簡單地使用'如果errorlevel 1 exit 0 else exit%errorlevel%' – mafu 2011-10-12 09:43:48

+1

@mafutrct:Wunderbar!如果你添加了你的評論作爲答案,我會upvote它。 – 2012-03-01 00:21:47

+5

@mafutrct不! '如果errorlevel 1 ...'表示「如果錯誤大於或等於1」。換句話說,這會捕獲所有錯誤,但不會「不需要複製」(robocopy的0退出代碼)。但是,我認爲你需要'如果%errorlevel%leq 1 exit 0 else exit%errorlevel%'。 – skrebbel 2012-10-31 10:27:34

17

添加每個請求的這個答案。基於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沒有發生錯誤,也沒有進行復制。目標目錄樹和目標目錄樹完全同步。

+0

其實只有大於7(8以上)的值才表示失敗,請參見我的回答 – 2016-06-20 15:42:08

+1

謝謝@OhadSchneider,我已經編輯了答案以澄清此問題 – mafu 2016-06-20 22:34:20

7
只需

檢查的1退出代碼是不正確,因爲any exit code below 8 is non-erroneous

任何大於8的值表明有在複製操作過程中的至少一個發生故障 。

(只是爲了澄清,8退出代碼是一個錯誤,以及:Several files did not copy

正確的代碼,那麼,應該是這樣的:

IF %ERRORLEVEL% GEQ 8 exit 1 
exit 0 
+1

這應該被接受的答案! – nawfal 2016-06-20 13:57:00

3

語法上這裏是一個一行一行的版本,可直接在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 

參考文獻:

相關問題