【发布时间】: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