压缩长路径的文件夹

压缩长路径的文件夹

现在,我自豪地拥有了我公司的离职脚本(耶!)。我一直在查看代码并进行测试,我注意到,在某些用户的主文件夹中,我已达到 PowerShell 的 260 个字符限制。这是一个问题,因为我们的政策规定,任何因“诉讼保留”而离开公司的人都需要压缩并存储他们的整个主文件夹,直到法律部门将其释放(换句话说,就是永远)。脚本的其余部分运行良好,并处理了其他所有事情,因此我希望此过程保留在 PowerShell 中。

我尝试过很多方法/手段/变通办法,但还没找到一个有效的。以下是我尝试过的:

阿尔法金融系统:可以获取所有文件名,但是当我将输出发送到本机 cmdlet 时会出现故障(这并不奇怪)
AlphaFS 压缩:非递归
7-Zip:无法正确保留时间戳
ICSharpCode.SharpZipLib:达到 PS 字符限制

*编辑:我也尝试过QuickIO.NET但使用压缩方法没有突破 PS 限制。
*编辑 2:尝试过系统.IO.压缩.文件系统- 达到 PS 字符限制

不幸的是我无法发布代码,但是这个想法非常简单。

主文件夹--> PowerShell--> 压缩文件

我可以加载脚本中可能需要的任何模块,但它必须保留 PowerShell,并且文件夹内容需要压缩到一个文件中。我希望这是可能的。

任何帮助,将不胜感激。

谢谢

答案1

我建议使用 emcopy / robocopy 将目录移动到更短的路径长度。

然后您就可以轻松地在 powershell 中按照您想要的方式对其进行操作。

即使将其压缩,然后使用 emcopy 将其移回

答案2

这更像是一个 SO 类型的答案,但既然你提到你已经在使用 AlphaFS.. AlphaFS 实际上有一个递归压缩选项,你只需要传递该选项,如上所述这里基本上只需要添加,32到你的方法调用中[Alphaleonis.Win32.Filesystem.Directory]::Compress($path,32)

但请记住,这使用 NTFS 压缩而不是创建 zip 文件。

答案3

根据您的描述,Get-ChildItem 的 260 个字符限制似乎阻止您将路径发送到 zip 程序。

我使用以下方法解决了这个问题获取文件夹项,它解析 Robocopy 的输出以获取文件夹中文件的完整路径 - 值得庆幸的是,Robocopy 对路径的限制为 65,535 个字符。Get-FolderItem 不支持递归文件夹遍历,因此您仍然需要使用它Get-ChildItem -Directory来递归检索所有文件夹。

例子:

    $homeDirectoryFolders = Get-ChildItem $homeDirectory -Recurse -Directory

    ForEach ($HDFolder in $homeDirectoryFolders) {
        $homeDirectoryFiles = Get-FolderItem $HDFolder.FullName
    }

    #Zip $homeDirectoryFiles here

相关内容