Robocopy并获取复制文件名

问题描述:

我正在使用robocopy只同步较新的文件,但我也需要获取被复制的文件名。Robocopy并获取复制文件名

我必须进一步使用复制的文件名在某个其他文件中创建一个条目。

我无法找到开关,它只显示复制的文件名,批处理文件的任何PowerShell脚本也会没问题。

user182904,

我修改了我的答案以满足您的要求。

请尝试以下cmd文件。

1)它会从robocopy创建一个日志文件,只是复制文件夹\文件。

2)它会将该日志文件去除到复制的文件中。

@echo off 

rem source folders for robocopy 
set source="c:\test\files" 
set destin="c:\test\files2" 

rem logfile names 
set sourcelogfile=log-from-robocopy.txt 
set destinlogfile=log-just-files.txt 

rem robocopy command to output files copied 
robocopy %source% %destin% /e /LOG:"%sourcelogfile%" /NP /NS /NC /NDL /TEE /NJH /NJS 

rem for loop through robocopy output and stip it down to just file names into new logfile 
for /f "tokens=*" %%i in (%sourcelogfile%) do (
    for /f "delims=" %%f in ("%%i") do (
     echo %%~nxf >> %destinlogfile% 
    ) 
) 

rem end of code 

您可以添加您选择到的Robocopy行,但你需要在该行的末尾添加的选项,输出脚本的其余部分将分析日志文件。

希望有所帮助。所有ROBOCOPY开关

细节可以在这里找到:

源:http://ss64.com/nt/robocopy.html

+0

感谢您的回复。 Robocopy生成大量输出,我只想要复制文件的名称或解析该日志文件的脚本,并只生成正在复制的“文件”。 – 2015-02-10 06:59:00

本函数解析所有ROBOCOPY文本输出,并输出其作为一个很好的对象。

使用方法如下:

$RoboCopyOutput = robocopy $source $destination /ROBOSWITCHES 

Parse-RoboCopyOutput $RoboCopyOutput 

或者这样:

Parse-RoboCopyOutput (robocopy e t /s) 

(其中显示了错误处理)

我不能要求所有的忍者正则表达式的技能,我自己:几年前我在网上发现了一些东西,并且随着时间的推移而扩大了它。对不起,我现在找不到原始文章,或者我会发布一个链接。

我的RoboCopy版本检查仅查找我在我的环境中遇到的版本,并不详尽,请注意。找到您的版本的日期格式并将其添加到switch语句应该很容易。

Function Parse-RoboCopyOutput ($RoboCopyOutput) 
{ 
    #Get RoboCopy version info to determine the date format 
    switch ((Get-Command robocopy).FileVersionInfo.ProductVersion) 
    { 
     {$_ -eq 'XP027'}   {$RobocopyDateFormat = 'ddd MMM dd HH:mm:ss yyyy' ; break} #Vista/Windows 7/Server 2008 
     {$_ -eq '6.2.9200.16384'} {$RobocopyDateFormat = 'dd MMMM yyyy HH:mm:ss' ; break}  #Windows 8 
     {$_ -eq '6.3.9600.16384'} {$RobocopyDateFormat = 'dd MMMM yyyy HH:mm:ss' ; break}  #Windows 8.1 
     default      {throw "Unknown robocopy version."} 
    } 

    #Find the line numbers of the '----' spacers in the robocopy output 
    $null,$HeaderStart,$HeaderEnd,$FooterStart = $RoboCopyOutput | Select-String "----" | Foreach-Object {$_.linenumber} 

    #Create the object to store all the parsed robocopy output information 
    $RoboObject = New-Object PSObject 

    #Grab the first section of the robocopy output by line number 
    $RoboCopyOutput[$HeaderStart..$HeaderEnd] | Foreach-Object ` 
    { 
     Switch -regex ($_) 
     { 
      'Started :(.*)'  { 
            Add-Member -InputObject $RoboObject -Name StartTime -Value ` 
             ([datetime]::ParseExact($matches[1].trim(),$RobocopyDateFormat,$null)) -MemberType NoteProperty 
           } 
      'Source :(.*)'  { 
            Add-Member -InputObject $RoboObject -Name Source -Value ($matches[1].trim()) -MemberType NoteProperty 
           } 
      'Dest (.)(.*)'  { 
            Add-Member -InputObject $RoboObject -Name Destination -Value ($matches[2].trim()) -MemberType NoteProperty 
           } 
      '^ Files :(.*)' { 
            Add-Member -InputObject $RoboObject -Name FilesToCopy -Value ($matches[1].trim()) -MemberType NoteProperty 
           } 
      'Exc Files :(.*)' { 
            Add-Member -InputObject $RoboObject -Name ExcFiles -Value ($matches[1].trim()) -MemberType NoteProperty 
           } 
      'Exc Dirs :(.*)' { 
            Add-Member -InputObject $RoboObject -Name ExcDirs -Value ($matches[1].trim()) -MemberType NoteProperty 
           } 
      'Options :(.*)'  { 
            Add-Member -InputObject $RoboObject -Name Options -Value ($matches[1].trim()) -MemberType NoteProperty 
           } 
     } 
    } 

    #Grab the second section of the robocopy output by line number (if the copy has completed). 
    if ($FooterStart) 
    { 
     $RoboCopyOutput[$FooterStart..($RoboCopyOutput.Count -1)] | Foreach-Object ` 
     { 
      Switch -regex ($_) 
      { 
       'Ended :(.*)'  { 
             Add-Member -InputObject $RoboObject -Name StopTime ` 
              -Value ([datetime]::ParseExact($matches[1].trim(),$RobocopyDateFormat,$null)) -MemberType NoteProperty 
            } 
       'Speed :(.*) Bytes' { 
             Add-Member -InputObject $RoboObject -Name BytesPerSecond -Value ($matches[1].trim()) -MemberType NoteProperty 
            } 
       '(Total.*)'   { 
             $Columns = $_.Split() | Where-Object {$_} 
            } 
       'Dirs :(.*)'  { 
             $Fields = $matches[1].Split() | Where-Object {$_} 

             $Dirs = New-Object PSObject 

             0..5 | Foreach-Object ` 
             { 
              Add-Member -InputObject $Dirs -Name $Columns[$_] -Value $Fields[$_] -MemberType NoteProperty 

              Add-Member -InputObject $Dirs -Name 'toString' -MemberType ScriptMethod ` 
               -Value {[string]::Join(" ",($this.psobject.Properties | Foreach-Object {"$($_.name):$($_.value)"}))} -force 
             } 

             Add-Member -InputObject $RoboObject -Name Directories -Value $Dirs -MemberType NoteProperty 
            } 
       'Files :(.*)'  { 
             $Fields = $matches[1].Split() | Where-Object {$_} 

             $Files = New-Object PSObject 

             0..5 | Foreach-Object ` 
             { 
              Add-Member -InputObject $Files -Name $Columns[$_] -Value $Fields[$_] -MemberType NoteProperty 

              Add-Member -InputObject $Files -Name 'toString' -MemberType ScriptMethod ` 
               -Value {[string]::Join(" ",($this.psobject.Properties | Foreach-Object {"$($_.name):$($_.value)"}))} -force 
             } 

             Add-Member -InputObject $RoboObject -Name Files -Value $files -MemberType NoteProperty 
            } 
       'Bytes :(.*)'  { 
             $Fields = $matches[1].Split() | Where-Object {$_} 

             $Fields = $Fields | Foreach-Object {[email protected]();$i=0}{if ($_ -match '\d') {$New += $_;$i++} else {$New[$i-1] = ([double]$New[$i-1]) * "1${_}B"}}{$New} 

             $Bytes = New-Object PSObject 

             0..5 | Foreach-Object ` 
             { 
              Add-Member -InputObject $Bytes -Name $Columns[$_] -Value $Fields[$_] -MemberType NoteProperty 

              Add-Member -InputObject $Bytes -Name 'toString' -MemberType ScriptMethod ` 
               -Value { 
                [string]::Join(" ",($this.psobject.Properties | Foreach-Object {"$($_.name):$($_.value)"})) 
                } -force 
             } 

             Add-Member -InputObject $RoboObject -Name Bytes -Value $bytes -MemberType NoteProperty 
            } 
       } 
      } 

     #If the copy completed, calculate elapsed time 
     if ($RoboObject.StopTime) 
     { 
      $ElapsedTime = ($RoboObject.StopTime) - ($RoboObject.StartTime) 

      Add-Member -InputObject $RoboObject -Name ElapsedTime -Value $ElapsedTime -MemberType NoteProperty 
     } 
    } 
    else 
    { 
     #Grab the RoboCopy error 
     $RoboCopyOutput[($HeaderEnd +1)..($RoboCopyOutput.Count -1)] | ForEach-Object ` 
     {   
      $ErrorMessage += $_.ToString()   
     } 

     Add-Member -InputObject $RoboObject -Name ErrorMessage -Value $ErrorMessage -MemberType NoteProperty 
    } 

    #Output 
    $RoboObject 
} 
+0

对不起,我刚刚意识到你是在一个文件列表之后。我很抱歉。我会留下来,因为它可能会在输出解析器之后被人发现。 – ConanW 2015-02-10 15:19:35

+0

实际上,应该很容易将filelist属性添加到输出对象。我会去那里。 – ConanW 2015-02-10 15:20:47