PowerShell 脚本可以移动少于 5 分钟的文件吗?

PowerShell 脚本可以移动少于 5 分钟的文件吗?

我们有一个网络文件夹,用于存放未正确处理的 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将匹配的文件移动到指定目录。

相关内容