# encoding: ascii # api: powershell # title: Robocopy Wrapper # description: This function performs an ROBOCOPY command with the well known parameters `Source`, `Target`, `Files` and `Optinos`. The ROBOCOPY result is converted to a easy to read PSObject. # version: 0.1 # type: function # author: Claudio Spizzi # license: CC0 # function: Copy-Robocopy # x-poshcode-id: 3607 # x-archived: 2016-08-11T17:30:22 # x-published: 2013-09-03T15:47:00 # # function Copy-Robocopy { param ( [Parameter(Position=0, Mandatory=$true)] [String] $Source, [Parameter(Position=1, Mandatory=$true)] [String] $Target, [Parameter(Position=2, Mandatory=$false)] [String[]] $Files = @("*.*"), [Parameter(Position=3, Mandatory=$false)] [String] $Options = "" ) # Result $Result = @{ "Params" = @{} "Timing" = @{} "Result" = @{} } # Define Log File $LogFile = $ENV:TEMP + "\Robocopy." + (Get-Date -UFormat "%Y%m%d.%H%M%S") + "." + (Get-Random -Minimum 1000 -Maximum 9999) + ".log" # Remove Wrong Options $Options = $Options.Replace('/NJH', "") $Options = $Options.Replace('/NJS', "") # Start Process $Duration = Measure-Command { Start-Process -FilePath 'ROBOCOPY' -ArgumentList ('"' + $Source + '" "' + $Target + '" "' + [String]::Join('" "', $Files) + '" ' + $Options) -RedirectStandardOutput $LogFile -NoNewWindow -Wait } # Import Robocopy Log $Robocopy = Get-Content -Path $LogFile # Line Numbers $LineHeaderFirst = (0..($Robocopy.Count - 1) | Where-Object { $Robocopy[$_] -eq "-------------------------------------------------------------------------------" })[0] $LineHeaderLast = (0..($Robocopy.Count - 1) | Where-Object { $Robocopy[$_] -eq "------------------------------------------------------------------------------" })[0] $LineFooterFirst = (($Robocopy.Count - 1)..0 | Where-Object { $Robocopy[$_] -eq "------------------------------------------------------------------------------" })[0] $LineFooterLast = ($Robocopy.Count - 1) # Result Params $Result["Params"]["Source"] = ([String]($Robocopy[$LineHeaderFirst + 5].Split(":", 2)[1].Trim())) $Result["Params"]["Target"] = ([String]($Robocopy[$LineHeaderFirst + 6].Split(":", 2)[1].Trim())) $Result["Params"]["Files"] = ([String]::Join(", ", (($LineHeaderFirst + 8)..($LineHeaderLast - 4) | ForEach-Object { $Robocopy[$_].Split(":", 2)[-1].Trim() }))) $Result["Params"]["Options"] = ([String]($Robocopy[$LineHeaderLast - 2].Split(":", 2)[1].Trim())) # Result Timing $Result["Timing"]["Duration"] = ([String]($Duration)) $Result["Timing"]["Started"] = ([String](Get-Date -Date $Robocopy[$LineHeaderFirst + 4].Split(":", 2)[1].Trim())) $Result["Timing"]["Ended"] = ([String](Get-Date -Date $Robocopy[$LineFooterLast - 1].Split(":", 2)[1].Trim())) # Result Result for ($Line = ($LineFooterFirst + 3); $Line -le ($LineFooterFirst + 6); $Line++) { $Key = $Robocopy[$Line].Substring(02,07).Trim() $Result["Result"][$Key] = @{} for ($Col = 10; $Col -le 60; $Col += 10) { $Title = $Robocopy[$LineFooterFirst + 2].Substring($Col, 10).Trim() $Title = $Title.Substring(0,1).ToUpper() + $Title.Substring(1).ToLower() $Result["Result"][$Key][$Title] = $Robocopy[$Line].Substring($Col, 10).Trim() } } # Return return $Result }