PowerShell脚本:将包括子文件夹在内的文件和文件夹从一个位置移动到另一个位置,这些文件和文件夹的创建时间早于x天。

17

我编写了一个 PowerShell 脚本,它完全正常工作。唯一的挑战是子文件夹中的文件未能移动到目标文件夹。

get-childitem -Path "\\servername\location" |
    where-object {$_.LastWriteTime -lt (get-date).AddDays(-31)} |
    move-item -destination "C:\Dumps"

我无法进一步定制这个脚本。

4个回答

21

不要浪费时间试图在PowerShell中重新发明robocopy

robocopy \\servername\location C:\Dumps /e /mov /minage:31

此脚本正在将文件复制到目标位置,仅从主路径复制。我想要包括子文件夹。我想将它们移动到另一个位置。 - user1926332
1
使用 /s 递归到子文件夹。使用 /e(而不是 /s)也包括空的子文件夹。你所说的“另一个位置”是什么意思?您是否不想保留文件夹结构?在这种情况下,您可以坚持使用PowerShell(带有 -Recursive选项,就像 @Musaab提到的那样)。但是,这种方法会使您面临由于覆盖文件而导致数据丢失的风险。 - Ansgar Wiechers
谢谢Ansgar...你的robocopy脚本完成了我的需求,而且我还能够为另一个用途构建一个脚本。 - user1926332
4
Robocopy通过逐位复制文件,然后删除源文件来完成移动操作。这种方式比快速移动要慢得多。这种行为无法关闭。 - peterson
@peterson,如果不这样做,你会如何在不同的文件系统之间移动文件? - Ansgar Wiechers
3
这种行为发生在同一文件系统的文件夹之间移动时。据我所知,没有其他程序使用这种奇怪且缓慢的方法,因此值得一提。 - peterson

17

使用Get-ChildItem命令的-Recurse选项来遍历子文件夹中的文件,然后通过将集合传递到Move-Item来逐个移动每个文件。

Get-ChildItem -Path "C:\Test" -Recurse |
  Where-Object {$_.LastWriteTime -lt (Get-date).AddDays(-31)} |
  Move-Item -destination "C:\Dumps"

这是一张截图:

截图


Musaab,-Recursive似乎无法正常工作。您能否提供进一步帮助? - user1926332
你确定这些文件符合 where-object 子句的要求吗? 我会更新我的答案,并附上截图以说明我如何使用 -Recursive 选项。请检查并告诉我我做了什么不同。 - Musaab Al-Okaidi
你好,Musaab...我现在遇到了一个新的挑战...使用上面那个脚本...我尝试在Windows任务计划程序中(Windows 2008服务器X84位)进行计划安排但是 PowerShell 脚本无法运行...在批处理中手动运行它可以完成工作。请问你能否帮我进一步解决问题...我已经放置了很多参数来使其正常运行, 但没有任何效果...请帮忙... - user1926332
看一下我对这个问题的回答,可能会有所帮助。http://stackoverflow.com/questions/14635995/running-powershell-script-as-scheduled-task/14644128#14644128 - Musaab Al-Okaidi
4
这不保留文件夹结构。 - Sam Holder

8

简化上述命令为:


robocopy A:\ B:\ /MIR /minage:31
其中,A:\是源路径,B:\是目的地路径。


0
我需要一个快速的一行代码将所有数据从一个驱动器移动到另一个驱动器。这个命令对我非常有效:
Get-ChildItem "E:" -Recurse | Move-Item -Destination "G:"

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