【问题标题】:How do I zip up files that are too long?如何压缩太长的文件?
【发布时间】:2019-01-16 03:05:57
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 一个选项是启用长文件名。这可以通过注册表项直接完成,或者您可以使用组策略进行更改。搜索 win10 enable long file names 很容易找到 reg 键。
  • 感谢您的回复。这样做了,我仍然得到同样的东西。 7z 运行失败:文件名或扩展名太长
  • 哎哟!我没有其他可行的想法。通常的做法是将驱动器深深地映射到污垢中以缩短有效路径,但这对于除了几台计算机之外的任何东西都是行不通的。
  • 首先,对 zip 文件名和要压缩的文件重新使用 $Target 变量是令人困惑的(至少对我而言)。也许您的意思是这样的:$Files = Get-Childitem $Source -Recurse | Where-Object -FilterScript {($_.LastWriteTime -ge $LastWrite)} $files | %{ zip a -mx=9 $Target $_ } #zip each file 另外,尝试通过切换到更深的文件夹并获取相对路径来存储文件的较短路径。有关示例,请参见 [我的脚本] (stackoverflow.com/questions/53740869/…)。
  • 好的。像这样的工作: $Files = Get-ChildItem -LiteralPath $TargetFolder -Recurse |其中 {$_.LastWriteTime -le "$LastWrite"} Zip "$($ENV:USERPROFILE)\Desktop\TEST.zip" $Files

标签: powershell path filenames


【解决方案1】:

如 cmets 中所述,解决长文件名的一种方法是存储相对路径。如果您使用相对路径指定输入文件,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

【讨论】:

  • 感谢您的回复。试过了。它制作 zip 存档,但存档不包含任何内容。
  • 您在 d:\Testing\ 下是否有任何超过 60 天的文件?尝试在 Powershell ISE 中打开脚本,然后按 F9 在 $FileList = (Get-ChildItem .. 行上添加断点。使用 F5 运行脚本并使用 F11 键单步执行该行。将鼠标悬停在每个变量上以查看值。
  • 又试了一次。这次似乎奏效了。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多