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



我正在尝试将文件从源文件夹复制到目标文件夹。我只想复制过去 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 字符:9 + if ($File.LastWriteTime -gt $timespan( + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 类别信息 : 无效操作: (:) [], 运行时异常 + 完全限定错误 ID:比较失败

您正在比较日期时间和时间跨度。 这说不通。 日期时间是一个时间点。 时间跨度是一个持续时间。 您需要比较两个日期。

尝试:

$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行中是否存在错误。 你可能想要一个美元符号和日期前的空格,但我猜这是不对的。

根据您粘贴的错误,Powershell 在将 System.TimeSpan 转换为 System.DateTime 类型时遇到问题。这是两个不同的对象,在它们协同工作之前,您必须将一个投射到另一个中。

最新更新