我们有一个网络文件夹,用于存放未正确处理的 XML 文件。有人要求我设计一个脚本,每五分钟运行一次,检查文件夹中是否有任何少于五分钟的文件。如果找到少于五分钟的文件,它会将它们移至另一个目录进行处理。
诀窍是,我们只希望它移动文件一次。如果第二次失败,它们将被扔回到该文件夹中,并需要留在那里以便稍后处理。
每个文件名都包含唯一的时间和日期戳作为文件名的一部分。这有点复杂,但格式如下:
YYYYMMDDHHmmSSSSS
我在想,也许有一种方法可以让 PowerShell 查看文件名的“mm”标记并将其与当前时间进行比较。如果时间少于五分钟,它会移动它。如果时间大于五分钟,它会保留它。
这可能吗?
答案1
请尝试以下操作:
Get-ChildItem |
Where-Object {
[datetime]::ParseExact($_.BaseName, "yyyyMMddHHmmss", $null) -gt (Get-Date).AddMinutes(-5)
} |
Move-Item -Destination C:\Path\to\target_dir
为了便于阅读,我将代码拆分为多行,但你当然可以将其变成一行,甚至可以使用以下方法缩短它:PowerShell 别名。
解释
Get-ChildItem
返回当前目录中所有文件的列表。注意:它还返回子目录,但此代码假设您只有子目录中的文件。结果通过管道 (|
) 传送到下一个命令。Where-Object
循环遍历上一个命令$_
的结果并仅返回符合指定条件的结果。表示每次迭代的当前文件,并且该.BaseName
属性返回不带扩展名的文件名。这
[datetime]::ParseExact()
函数采用字符串和日期格式并将其转换为日期时间对象。Get-Date
返回当前日期和时间。AddMinutes()
函数从当前时间减去5分钟。那么,返回的文件
Where-Object
是文件名中显示的日期和时间不超过当前时间 5 分钟的文件。最后,
Move-Item
将匹配的文件移动到指定目录。