Как мне сжать файлы, которые слишком длинные? - PullRequest
0 голосов
/ 15 января 2019

Я использую скрипт 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 голосов
/ 15 января 2019

Как уже упоминалось в комментариях, одним из способов обхода длинных имен файлов является сохранение относительных путей. 7Zip будет хранить относительные пути, если вы укажете входной файл с относительными путями, и они разрешат файлы, которые вы хотите заархивировать, как описано в этот ответ .

Промежуточные файлы могут быть грязными, поэтому я написал скрипт, который использует метод CreateEntryFromFile ZipFileExtensions для хранения относительного пути в zip-файле. Вы можете указать -ParentFolder в командной строке для хранения путей относительно родительского, включая UNC-путь, если вы хотите архивировать файлы на другом компьютере. Если -ParentFolder не указан, он выберет папку скрипта в качестве родительского и сохранит пути относительно скрипта.

Скопируйте код в новый скрипт с именем ArchiveOldLogs.ps1 и запустите его с помощью следующей командной строки:

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

Это даст вам еще 11 символов в конце пути для хранения, чего должно быть достаточно, чтобы обойти разницу в 10 символов между Windows и Zip пределами длины пути. Попробуйте более глубокую папку, если вы все еще получаете ошибки. Файлы, которые не могут быть заархивированы или уже заархивированы, будут пропущены.

Удалите -DeleteAfterArchiving:$false из командной строки, когда вам удобно, что она архивирует только то, что вы хотите.

...