使用Powershell复制和重命名在最后一天修改的文件

时间:2017-07-24 17:50:33

标签: powershell copy-item rename-item-cmdlet

我正在尝试将文件从源文件夹复制到目标文件夹。我想只复制在过去20分钟内修改过的文件。在我复制时,我还想将日期和时间附加到文件名的末尾。我目前的脚本是:

$DestinationFolder = "C:\Output\"
$timespan = new-timespan -minutes 20
$Files = Get-ChildItem "C:\Input\*" -File
foreach ($File in $Files) {
    if ($File.LastWriteTime -gt $timespan)
    {
        Copy-Item -Path $_.FullName -Destination $DestinationFolder$($_.BaseName)_$ ($_.LastWriteTime.ToString('yyyyMMdd_hhmmss'))$($_.Extension)
    }
}

当我尝试测试我的scipt时,我在powershell中收到错误消息:

无法将“07/21/2017 07:31:01”与“00:20:00”进行比较。错误:“无法转换类型的”00:20:00“值 “System.TimeSpan”键入“System.DateTime”。“ 在行:2 char:9 + if($ File.LastWriteTime -gt $ timespan) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~     + CategoryInfo:InvalidOperation:(:) [],RuntimeException     + FullyQualifiedErrorId:ComparisonFailure

2 个答案:

答案 0 :(得分:5)

您正在将DateTime与TimeSpan进行比较。这没有意义。日期时间是一个时间点。时间跨度是持续时间。你需要比较两个日期。

尝试:

$DestinationFolder = "C:\Output\"
$Cutoff = (Get-Date).AddMinutes(-20)
Get-ChildItem "C:\Input\*" -File | Where-Object {
    $_.LastWriteTime -gt $Cutoff
} | ForEach-Object {
    $DestinationFileName = '{0}_{1:yyyyMMdd_HHmmss}{2}' -f $_.BaseName, $_.LastWriteTime, $_.Extension
    $DestinationFullFileName = Join-Path -Path $DestinationFolder -ChildPath $DestinationFileName
    Copy-Item -Path $_.FullName -Destination $DestinationFullFileName
}

我无法判断您Copy-Item行中是否存在错误。在日期之前你可能想要一个美元符号和一个空格,但我猜这不对。

答案 1 :(得分:3)

根据您粘贴的错误,Powershell无法将System.TimeSpan转换为System.DateTime类型。这些是两个不同的对象,你必须在它们一起工作之前将它们投入另一个。