powershell - 在过去 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"
解决方案
简而言之,您的过滤器是错误的,因为它在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"
推荐阅读
- php - 如何删除laravel中的多个ID?
- javascript - 如何在使用 javascript 单击 URL 时为其添加值
- javascript - React Js - 'styles' 未定义 no-undef 错误
- objective-c - 屏幕锁定时计时器停止
- java - 当另一个进程同时写入同一个表时,Java ResultSet 的行为是什么?
- regex - 用于在 bash 中构建 gradle 文件的正则表达式
- slice - Myhdl:将位片分配给带符号的变量失败并出现负值
- excel - 硒VBA中的滚动元素
- javascript - 如何在视图部分显示动画并停止重复
- python - 与拉普拉斯金字塔混合的图像产生不良图像