1

我正在尝试将文件从源文件夹复制到目标文件夹。我只想复制过去 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”进行比较。错误:“无法将“System.TimeSpan”类型的“00:20:00”值转换为“System.DateTime”类型。” 在 line:2 char:9 + if ($File.LastWriteTime -gt $timespan) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : ComparisonFailure

4

2 回答 2

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线路是否存在错误。你可能想要一个美元符号和一个空格,但我猜那是不对的。

于 2017-07-24T18:10:42.923 回答
3

根据您粘贴的错误,Powershell 无法将 System.TimeSpan 转换为 System.DateTime 类型。这是两个不同的对象,您必须先将一个对象放入另一个对象中,然后它们才能一起工作。

于 2017-07-24T18:09:16.147 回答