使用Powershell获取超过x天的文件并将其移动

4

我相信这可能已经被问了一百万次了。我对Power Shell非常陌生,想问一下我的做法是否正确。

在目录中,我们有许多文件类型。我想要完成的是只移动一个月前的PDF文件,而不去碰其他文件扩展名。文件夹中的扩展名为:

pdf、xml、csv

在提问之前,我已经搜索过论坛。这是我目前为止的内容:

get-childitem -path \\server\folder -include "*.pdf" -exclude "*.xml,*.csv" | where-object {$_.LastWriteTime -gt (get-date).AddDays(-31)} | move-item -destination \\server\folder\folder2

有一个问题,如果没有文件扩展名,你将如何处理排除操作?

感谢您花费时间和耐心帮助我这个新手!

4个回答

3
不需要使用 "where" 来测试扩展名,因为 get-childitem 已经帮你做了。尽管在搜索单个扩展名时,我会使用筛选参数(第二个位置参数)来查找例如:
$date = (get-date).AddDays(-31)
get-childitem \\server\folder *.pdf | where-object {$_.LastWriteTime -gt $date} | 
    move-item -destination \\server\folder\folder2

顺便提一下,使用筛选参数也更快,这可能在搜索网络共享时很重要。


我在网上看到了关于“-filter”开关的内容。Power Shell比DOS好多了!我正在将我们所有的DOS脚本重写为Power Shell。对我来说,Power Shell似乎要容易得多。感谢您的帮助。 - user3013729
1
这个脚本似乎获取了最近31天内修改的所有文件,而不是之前的文件。 - Nichlas H.

1

一种方法是在您的where-object块中添加$_.Extension -eq ".pdf",以便仅获取这些扩展名。

get-childitem -path \\server\folder  | where-object {
$_.extension -eq ".pdf" -and ($_.LastWriteTime -gt (get-date).AddDays(-31))} | move-item -destination C:\test\test

另外,如果你需要一个月之前的文件,你的日期比较应该是-lt而不是-gt。

get-childitem -path \\server\folder  | where-object {
$_.extension -eq ".pdf" -and ($_.LastWriteTime -lt (get-date).AddDays(-31))} | move-item -destination C:\test\test

我知道“-gt”是大于的意思,那么“-lt”代表什么呢?感谢您提供的扩展变量,我之前并不知道。非常感谢您的帮助。 - user3013729
没问题。-lt 表示“小于”。时间戳越旧,数值越小。因此,您想要的是比 31 天前更早的文件。在这里使用 -gt 只会获取最近 31 天内编写的文件。 - malexander

1

另一种方法是指定“-Name”标志,并在文件名中使用通配符:

get-childitem -path \\server\folder -name "*.pdf" | where-object {$_.LastWriteTime -gt (get-date).AddDays(-31)} | move-item -destination \\server\folder\folder2

0

我不确定是否理解您的最后一个问题,但如果您有没有扩展名的PDF文件,请参见此讨论

我认为这样的东西可以帮助您。 file.exe下载)显示文件的MIME类型,例如PDF文档,版本1.6,具体取决于PDF文件的版本。

 gci . | ? { (file.exe -b $_) -match "pdf" }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接