Powershell 如何压缩过长的文件?

Powershell 如何压缩过长的文件?,powershell,path,filenames,Powershell,Path,Filenames,我正在使用PowerShell脚本压缩超过60天的文件。其中一些文件的文件名很长,所以我得到的文件名或扩展名太长错误 我不希望进入每个文件并更改名称,因此我需要一种方法,以便能够同时对所有文件应用某些内容,或者让我的脚本以某种方式绕过错误。这个脚本也将在多台计算机上运行,所以我不希望在每台计算机上下载一些东西 以下是脚本: #Set source and target $Source = "D:\Testing\" $Target = "$ENV:USERPROFILE\Desktop\TES

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

如评论中所述,一种解决长文件名的方法是存储相对路径。如果您使用相对路径指定输入文件,并且这些路径解析为要存档的文件,7Zip将存储相对路径,如中所述

中间文件可能会很混乱,所以我有一个方法在zip文件中存储相对路径。 您可以在命令行上指定-ParentFolder来存储相对于父级的路径,如果要在另一台计算机上存档文件,则包括UNC路径。如果未指定-ParentFolder,它将选择脚本的文件夹作为父文件夹,并存储相对于脚本的路径

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

 .\ArchiveOldLogs.ps1 -ParentFolder "D:\Testing\" -FileSpecs @("*.*") -Filter { $_.LastWriteTime -lt (Get-Date).AddDays(-60)} -DeleteAfterArchiving:$false
这将使您在要存储的路径末尾多存储11个字符,这应该足以绕过和路径长度限制之间的10个字符差异。如果仍然出现错误,请尝试更深入的文件夹。将跳过无法存档或已存档的文件


从命令行中删除
-DeleteAfterArchiving:$false
,前提是它只存档您想要的内容

一个选项是启用长文件名。这可以通过注册表项直接完成,也可以使用组策略进行更改。通过搜索
win10启用长文件名
,可以轻松找到注册表项。感谢您的回复。做了那件事,我还是得到了同样的东西。7z无法运行:文件名或扩展名太长!我没有其他可行的想法。通常的做法是将一个驱动器映射到dirtree中,以缩短有效路径,但这对于除少数几台计算机以外的任何计算机都是不可行的。首先,对zip文件名和要压缩的文件重复使用$Target变量是令人困惑的(至少对我来说)。也许您的意思是这样的:
$Files=Get Childitem$Source-Recurse | Where Object-FilterScript{($.LastWriteTime-ge$LastWrite)}$Files |%{zip a-mx=9$Target$}#压缩每个文件
。此外,通过切换到更深的文件夹并获取相对路径,尝试存储文件的更短路径。有关示例,请参见[我的脚本]()。确定。是否需要这样的工作:$Files=Get ChildItem-LiteralPath$TargetFolder-Recurse | Where{$\ uuu.LastWriteTime-le“$LastWrite”}Zip“$($ENV:USERPROFILE)\Desktop\TEST.Zip”$Files感谢您的响应。请尝试。它生成zip存档,但存档中不包含任何内容。您是否有任何文件在d:\Testing\下保存超过60天?尝试在Powershell ISE中打开脚本,然后点击F9在
$FileList=(Get ChildItem..
行上添加断点。使用F5运行脚本,并使用F11键逐步完成该行。将鼠标悬停在每个变量上以查看值。再次尝试。这次似乎有效。感谢帮助。