Назад | Перейти на главную страницу

Сжатие папок с длинными путями

Теперь я являюсь счастливым обладателем внебольничного сценария моей компании (Ура!). Я просматривал код и тестировал и заметил, что в домашних папках некоторых пользователей я превышаю ограничение PowerShell в 260 символов. Это проблема, потому что наша политика гласит, что любому лицу, находящемуся в состоянии судебного разбирательства, которое покидает компанию, необходимо сжать и сохранить всю свою домашнюю папку до тех пор, пока она не будет разрешена юридически (другими словами, навсегда). Остальная часть скрипта работает отлично и заботится обо ВСЕМ остальном, поэтому я хотел бы, чтобы этот процесс остался в PowerShell.

Я пробовал множество способов / методов / обходных решений, и я еще не нашел того, который работает. Вот что я пробовал:

AlphaFS : Может получить все имена файлов, но задыхается, когда я отправляю вывод в собственный командлет (неудивительно)
AlphaFS Compress : Не рекурсивный
7-молния : Не сохраняет временные метки должным образом
ICSharpCode.SharpZipLib : Превышено ограничение на количество символов PS

* Изменить: я тоже пробовал QuickIO.NET но не удалось преодолеть предел PS с помощью метода сжатия.
* Edit2: Пробовал System.IO.Compression.FileSystem - Достигает ограничения на количество символов PS

К сожалению, я не могу опубликовать код, но идея довольно проста.

Домашняя папка -> PowerShell -> Сжатый файл

Я могу загрузить любые модули, которые мне могут понадобиться в скрипте, но он должен остаться PowerShell, а содержимое папки нужно сжать в один файл. Я надеюсь, что это вообще возможно.

Любая помощь будет оценена.

Спасибо

Я бы рекомендовал использовать emcopy / robocopy, чтобы переместить каталог на более короткий путь.

Тогда вы легко сможете манипулировать им как хотите в PowerShell.

Даже если это заархивировано, а затем перемещено обратно с помощью emcopy

Это скорее ответ типа SO, но поскольку вы упомянули, что уже используете AlphaFS .. AlphaFS действительно имеет параметр рекурсивного сжатия, вам просто нужно передать этот параметр, как описано Вот в основном просто нужно добавить ,32 к вашему вызову метода так что-то вроде [Alphaleonis.Win32.Filesystem.Directory]::Compress($path,32)

Однако имейте в виду, что здесь используется сжатие NTFS, а не создание zip-файла.

Из того, что вы описали, похоже, что ограничение Get-ChildItem на 260 символов мешает вам отправлять пути в программу zip.

Я работаю над этой проблемой, используя Get-FolderItem, который анализирует вывод Robocopy, чтобы получить полные пути к файлам в папке - к счастью, Robocopy имеет ограничение на 65 535 символов на пути. Get-FolderItem не поддерживает рекурсивный обход папок, поэтому вам все равно придется использовать Get-ChildItem -Directory для рекурсивного получения всех папок.

Пример:

    $homeDirectoryFolders = Get-ChildItem $homeDirectory -Recurse -Directory

    ForEach ($HDFolder in $homeDirectoryFolders) {
        $homeDirectoryFiles = Get-FolderItem $HDFolder.FullName
    }

    #Zip $homeDirectoryFiles here