我工作的地方有多个文件服务器,其中包含数 TB 的文件。我们目前没有用于存档/删除陈旧数据的系统。我的任务是创建一个脚本,用于移动/删除超过 3 年的文件。除了移动/删除文件之外,仅“获取”文件就是一个问题。到目前为止使用的是 Powershell。
我遇到文件名/路径长度超过 ~248 个字符的文件,Powershell 似乎无法处理。我也研究过 Robocopy,但 Robocopy 无法访问 LastAccessTime 文件属性。此外,Powershell 似乎真的很慢。以下是我一直在测试的代码:
Get-ChildItem "\\path" -Force -Recurse |
where {!($_.PSIsContainer) -and ($_.LastAccessTime -lt (Get-Date).AddYears(-3))} |
select Mode,LastAccessTime,Length,Name
我的问题是:是否有更快、更有效的方法来递归地“获取”价值 TB 的文件(包括 LastAccessTime 属性),其中一些路径长度超过 248 个字符?
主要寻找免费的解决方案,但如果有一些好的付费解决方案,我愿意检查一下。
答案1
如果您使用的是 Win2k8 或更新版本,则可以使用文件服务器资源管理器创建文件过期任务,该任务会将旧文件移动x
到其他目录。
答案2
代码示例会很慢,因为在应用过滤器之前,您要递归枚举每个文件和目录。这不是 PowerShell 的错,.Net 中的底层文件系统类实际上非常快。
您想使用内置过滤器参数而不是通过管道传输到 where-object(一般来说,尽可能在“左边”进行过滤。)
答案3
不久前,我在做类似的事情时被 powershell 攻击了。这花了很长时间。幸运的是,我安装了 Cygwin,可以使用本机 *nix 命令测试相应的操作。所花的时间差异令人震惊。
因此,从速度上看,缓慢与窗口或文件系统本身关系不大,但与所用语言的执行效率有更大的关系。
我还没有尝试过路径深度/长度,但对于这些非常耗时的文件处理任务,我现在在 Windows 机器上使用 cygwin 而不是 powershell。这很糟糕,但就是这样。
可能还有其他更值得推荐的替代方案,它们也能比 Windows 原生命令更快地执行文件操作。如果有一个,那么我认为有很多。
答案4
我将仅使用 Robocopy 并按照 LastModifiedDate 进行操作。