如何压缩过长的文件?

时间:2019-01-14 22:02:02

标签: powershell path filenames

我正在使用PowerShell脚本压缩超过60天的文件。其中一些文件的文件名确实很长,所以我得到文件名或扩展名过长的错误。

我不想进入每个文件并更改名称,所以我需要一种方法可以同时对所有文件应用某些内容,或者让我的脚本以某种方式绕过错误。该脚本还将在多台计算机上运行,​​因此我不希望在每台计算机上都下载一些东西。

这是脚本:

#Set source and target
$Source = "D:\Testing\" 
$Target = "$ENV:USERPROFILE\Desktop\TEST.zip"

#Set time parameters
$Days = 60    
$LastWrite = (Get-Date).Date.AddDays(-$Days)

#Invoke 7-zip
if (-not (test-path "$env:ProgramFiles\7-Zip\7z.exe")) {throw 
"$env:ProgramFiles\7-Zip\7z.exe needed"} 
set-alias zip "$env:ProgramFiles\7-Zip\7z.exe"  

$Target = Get-Childitem $Source -Recurse | Where-Object -FilterScript 
{($_.LastWriteTime -ge $LastWrite)}

zip a -mx=9 $Target $Source

我正在使用7-zip压缩文件,并且具有PS 5.1版。

1 个答案:

答案 0 :(得分:0)

如注释中所述,长文件名的一种解决方法是存储相对路径。如果您指定具有相对路径的输入文件,则7Zip将存储相对路径,它们将解析为要存档的文件,如this answer中所述。

中间文件可能比较混乱,因此我使用written a script that uses the ZipFileExtensions' CreateEntryFromFile方法将相对路径存储在zip文件中。 您可以在命令行上指定-ParentFolder来存储相对于父级的路径,如果要在另一台计算机上归档文件,则包括UNC路径。如果未指定-ParentFolder,它将选择脚本的文件夹作为父文件夹,并存储相对于脚本的路径。

将代码复制到名为ArchiveOldLogs.ps1的新脚本中,并使用以下命令行运行它:

 .\ArchiveOldLogs.ps1 -ParentFolder "D:\Testing\" -FileSpecs @("*.*") -Filter { $_.LastWriteTime -lt (Get-Date).AddDays(-60)} -DeleteAfterArchiving:$false

这将使您在存储路径的末尾再获得11个字符,这应该足以绕过WindowsZip路径长度限制之间的10个字符差。如果仍然出现错误,请尝试更深的文件夹。无法归档或已经归档的文件将被跳过。

当您感到满意时,只需从命令行中删除-DeleteAfterArchiving:$false即可。