首页 > 解决方案 > 在过去 1 分钟创建的文件中查找特定单词的 Powershell 脚本

问题描述

刚刚编写了 Powershell 脚本,该脚本将在子文件夹中查找包含 1 分钟前创建的名称中的“.doc_”的文件,然后将其移动到另一个子文件夹。

当我运行 powershell 脚本时,它会移动名称中包含“.doc_”的文件,该文件是在 1 分钟前创建的,但它也会移动名称中包含“.doc_”的相同文件,该文件是几天前创建的,这不是必需的。

您能否让我知道为什么我的代码会考虑超过 1 分钟的文件

get-childitem -Path "C:\Users\Administrator\Desktop\Test\Test2" | where-object {$_.Name -match ".doc_" -and $_.LastWriteTime -lt (get-date).Adddays(-0) -and $_.LastWriteTime -lt (get-date).AddMinutes(-1)}| move-item -destination "C:\Users\Administrator\Desktop\Test"

标签: powershellpowershell-2.0powershell-3.0

解决方案


简而言之,您的过滤器是错误的,因为它1 分钟前Get-Date抓取了所有内容。这是由于操作员,如果您与操作员交换它应该可以工作。-lt-gt

好,下一题。由于您实际上不是在文件中搜索特定单词,而是在文件名中搜索,因此我们可以使用FileSystem Provider 过滤该文件名,我们将牺牲RegEx使用 -match)来使用通配符表达式;这将使速度提高 40 倍,因为通过管道发送任何东西都非常昂贵

Get-ChildItem -Path "C:\Users\Administrator\Desktop\Test\Test2" -Filter "*.doc_*" | 
    where-object { $_.LastWriteTime -gt (Get-Date).AddMinutes(-1) } | 
    Move-Item -Destination "C:\Users\Administrator\Desktop\Test"

如果时间很重要,我们可以尝试使用分组运算符( .. ).Where({})运算符/方法来避免管道。

  • 由于它不对对象本身执行任何直接操作,因此它被认为更像是一个运算符。
(Get-ChildItem -Path "C:\Users\Administrator\Desktop\Test\Test2" -Filter "*.doc_*").Where{ 
    $_.LastWriteTime -gt (Get-Date).AddMinutes(-1) 
} | Move-Item -Destination "C:\Users\Administrator\Desktop\Test"

推荐阅读