Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Robocopy和获取复制的文件名_Powershell_Batch File_Robocopy - Fatal编程技术网

Powershell Robocopy和获取复制的文件名

Powershell Robocopy和获取复制的文件名,powershell,batch-file,robocopy,Powershell,Batch File,Robocopy,我正在使用robocopy只同步较新的文件,但我还需要获取要复制的文件名 我必须进一步使用复制的文件名在其他文件中创建条目 我找不到开关,它只显示复制的文件名,批处理文件的任何powershell脚本也可以。user182904 我已经修改了我的答案以适应你的要求 尝试以下cmd文件 1) 它将从robocopy创建一个日志文件,其中只复制了文件夹\文件 @echo off rem source folders for robocopy set source="c:\test\files" s

我正在使用robocopy只同步较新的文件,但我还需要获取要复制的文件名

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

我找不到开关,它只显示复制的文件名,批处理文件的任何powershell脚本也可以。

user182904

我已经修改了我的答案以适应你的要求

尝试以下cmd文件

1) 它将从robocopy创建一个日志文件,其中只复制了文件夹\文件

@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
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交换机的详细信息可在此处找到:


来源:

此函数解析所有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 {$New=@();$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
}

谢谢你的回复。Robocopy会产生大量的输出,我只想要被复制文件的名称,或者一个脚本来解析该日志文件,并且只生成被复制的“文件”。对不起,我刚刚意识到你想要的是一个文件列表。我道歉。我将保留这个选项,因为人们在输出解析器之后可能会发现它。实际上,将filelist属性添加到输出对象应该很容易。我要试一试。