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
}
我使用 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
}