我写了一个快速脚本来比较跨服务器的文件差异,然后提供是否镜像更改的提示。 如果没有任何更改,我希望它智能地不提示复制。
剧本:
robocopy "$cSource" "$cDestination" /E /L /FP $cDecision = Read-host "Continue = 1, anything else = Stop" if ($cDecision -eq "1") { robocopy "$cSource" "$cDestination" /MIR /FFT /Z /W:5 /MT:64 /XX /log:$cLogLocation Invoke-item $cLogLocation } else { Write-host "Quit!" }
如果Robocopy报告“不匹配”,“失败”,“额外”和“复制”为0,我希望Powershell不要求继续。 对于这个特殊的项目来说这不是很重要,但是我可以考虑一些这样的检查的有用的用途。 谢谢!
最后有人在10秒内没有回答! 我用你的问题继续了解更多关于Powershell的信息。 以下对我有用,我希望看看其他人如何减less这个代码:
Clear-Host $ErrorActionPreference = "Continue" $DebugPreference = "Continue" $VerbosePreference = "Continue" @" ## robocopy_helper.ps1 ######################################################## Usage: powershell -ExecutionPolicy Bypass -File ./robocopy_helper.ps1 Purpose: Dry run before Full run of robocopy History: 07/11/2014 - Created ############################################################################### "@ ## User Supplied Variables $cSrc = "C:\Temp" $cDst = "C:\Temp2" $cLog = "c:\robo.log" ## Robocopy Dry Run $robo_test = robocopy "$cSrc" "$cDst" /E /L /FP ## Use Regular Expression to grab the following Table # Total Copied Skipped Mismatch FAILED Extras # Dirs : 1 0 1 0 0 0 # Files : 1 0 1 0 0 0 $robo_results = $robo_test -match '^(?= *?\b(Total|Dirs|Files)\b)((?! Files).)*$' ## Convert Table above into an array $robo_arr = @() foreach ($line in $robo_results){ $robo_arr += $line } ## Create Powershell object to tally Robocopy results $row = "" |select COPIED, MISMATCH, FAILED, EXTRAS $row.COPIED = [int](($robo_arr[1] -split "\s+")[4]) + [int](($robo_arr[2] -split "\s+")[4]) $row.MISMATCH = [int](($robo_arr[1] -split "\s+")[6]) + [int](($robo_arr[2] -split "\s+")[6]) $row.FAILED = [int](($robo_arr[1] -split "\s+")[7]) + [int](($robo_arr[2] -split "\s+")[7]) $row.EXTRAS = [int](($robo_arr[1] -split "\s+")[8]) + [int](($robo_arr[2] -split "\s+")[8]) ## If there are differences, lets kick off robocopy again if ( ($row.COPIED + $row.MISMATCH + $row.FAILED + $row.EXTRAS) -gt 0 ){ robocopy "$cSrc" "$cDst" /MIR /FFT /Z /W:5 /MT:64 /XX /log:$cLog Invoke-item $cLog } else { Write-host "Folders '$cSrc' and '$cDst' are twins" }
注:我已经把上面的正则expression式从一个句点改成了星号之前的空格。 这消除了在文件名/path中捕捉“文件”或“目录”或“总计”的风险。 原来的路线在后面。
jski 2014/07/16
$(robo_test -match)^(?=。 ?\ b(Total | Dirs | Files)\ b)((?!Files)。) $'
我意识到这是一个较老的线程,但请注意,也可以使用robocopy返回的退出代码来确定是否存在任何更改(值为0表示没有更改)。 有两种方法可以做到这一点:
$ RobocopyResult =启动进程-FilePath robocopy -ArgumentList $ RobocopyParams -Wait -PassThru $ RobocopyResult.ExitCode
如果使用Start-Process,则使用-PassThru非常重要,否则$ RobocopyResult中不会设置任何值。
其他退出代码列在http://ss64.com/nt/robocopy-exit.html 。
这是我的黑客。 我的代码读取日志文件并查找匹配汇总字段的行。 然后将其parsing为包含文件和目录统计信息的两个对象:
### Read data from log summary at end of RoboCopy log $Props = ((cat $RoboCopyLogFile | ? {$_ -like "*Total*Copied*Skipped*Mismatch*FAILED*Extras*"}) | select -Last 1).split(" ") | ? {$_ -match "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z"} $Dirs = (((cat $RoboCopyLogFile | ? {$_ -like "*Dirs : *"})) | select -Last 1).split(" ") | ? {$_ -match "1|2|3|4|5|6|7|8|9|0"} $Files = (((cat $RoboCopyLogFile | ? {$_ -like "*Files : *"})) | select -Last 1).split(" ") | ? {$_ -match "1|2|3|4|5|6|7|8|9|0"} ### Loop through the propteries of the summary $i = 0 $FileStats = @{} $DirStats = @{} foreach($Prop in $Props) { $FileStats.("$Prop") = $Files[$i] $DirStats.("$Prop") = $Dirs[$i] $i++ } $FileStats = New-Object -TypeName psobject -Property $FileStats $DirStats = New-Object -TypeName psobject -Property $DirStats