xcopy 仅在复制文件时显示

xcopy show only when files have been copied

我使用 xcopy 制作了一个脚本,该脚本生成一个带有日期的 csv 日志文件,以检查我的副本是否已完成。

我希望只有复制文件时才显示,复制0个文件时不显示任何内容

我该怎么做? 如果我没有说清楚,请告诉我

谢谢:)

这是我的代码:

$Logfile = "C:\Users\Name\Documents\Power\" 

Function LogWrite
{
   Param ([string]$logstring)

   Add-content $Logfile -value $logstring and 
}

function Get-TimeStamp 
{
   return "[{0:dd/MM/yy} {0:HH:mm:ss}]" -f (Get-Date)     
}


xcopy /s /f /y /b /d C:\Users\Name\Documents\SourceBack C:\Users\Name\Documents\DestBack 
>> xcopy.csv 

Write-Output "last copied file(s) on $(Get-TimeStamp)" | Out-file 
C:\Users\Name\Documents\Power\xcopy.csv -append 

我想这就是您要找的。

xcopy 的输出被重定向到一个临时文件。如果该文件仅包含一行(例如 0 File(s) copied),则不会采取进一步的操作。

否则,会将输出和带有时间戳的附加行添加到您的 CSV 文件中。

最后,无论结果如何,临时文件都会被删除。

$Logfile = "C:\Users\Name\Documents\Power\xcopy.csv" 

$TempFile = New-TemporaryFile

try {
    Start-Process xcopy `
        -ArgumentList '/s','/f','/y','/b','/d','C:\Users\Name\Documents\SourceBack','C:\Users\Name\Documents\DestBack' `
        -RedirectStandardOutput $TempFile.FullName `
        -Wait

    $ProcessOutput = @(Get-Content $TempFile)

    if ($ProcessOutput.Length -gt 1) {
        ($ProcessOutput + "last copied file(s) on $(Get-Date -Format '[dd/MM/yy HH:mm:ss]')") -join "`n" | Add-Content $Logfile
    }
} finally {
    Remove-Item $TempFile -Force
}

备注:

  • 我删除了 Get-TimeStamp 函数,因为它只使用了一次,在那种情况下并没有增加很多好处。

  • 我还删除了 LogWrite 函数,因为它没有在您的示例代码中使用,并且它包含语法错误(偏离 and)。

  • 您正在向 CSV 文件(最后复制的文件…)追加一行,这在您尝试稍后解析该文件。

更新

学不会到老,看来Start-Process根本没必要。有关详细信息,请参阅 here and here

$Logfile = "C:\Users\Name\Documents\Power\xcopy.csv" 

[string[]] $Output = & xcopy /s /f /y /b /d C:\Users\Name\Documents\SourceBack C:\Users\Name\Documents\DestBack 2>&1

if ($ProcessOutput.Length -gt 1) {
    ($ProcessOutput + "last copied file(s) on $(Get-Date -Format '[dd/MM/yy HH:mm:ss]')") -join "`n" | Add-Content $Logfile
}