#powershell #compression #system
#powershell #сжатие #система
Вопрос:
Я использую System.IO.Compression.Файловая система для сжатия папки с вложенными папками в сценарии powershell. Некоторые папки пусты, и вместо пустых папок создаются пустые файлы. Я думал, что это ошибка, но они указывают это в своей документации:
Структура каталогов из файловой системы сохраняется в архиве. Если каталог пуст, создается пустой архив. Используйте этот метод перегрузки, чтобы указать уровень сжатия и включать ли базовый каталог в архив.
Знаете ли вы, как этого избежать, я хочу, чтобы пустые папки были как папки… Это кажется смешным…
Редактировать:
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($Source, $Target, $compressionLevel, $true)
Комментарии:
1. Хммм … Я не уверен, правильно ли я вас понял. Если вы что-то сжимаете — неважно, что это такое, — результатом будет архивный ФАЙЛ, например archive.zip например. И если вы сожмете пустую папку, эта пустая папка окажется в таком файле архива. Рассматривали ли вы возможность использования встроенного командлета Compress-Archive ?
2. Не могли бы вы, пожалуйста, включить фрагмент того, как именно вы выполняете сжатие? Это поможет нам протестировать и устранить неполадки вместе с вами.
3. @root готово, это так просто, я думал, что в этом нет необходимости.
Ответ №1:
Для меня это работает просто отлично, если я добавляю ссылку на System.IO.Compression.FileSystem.dll
:
Add-Type -Path 'C:WindowsMicrosoft.NetassemblyGAC_MSILSystem.IO.Compression.FileSystemv4.0_4.0.0.0__b77a5c561934e089System.IO.Compression.FileSystem.dll'
# compress using just two parameters.
# This will omit the source folder and gives you no option to set the CompressionLevel
[System.IO.Compression.ZipFile]::CreateFromDirectory("D:Testzip", "D:result.zip")
Если вы также хотите включить исходный файл, используйте функцию с 4 параметрами:
[System.IO.Compression.ZipFile]::CreateFromDirectory("D:Testzip", "D:result.zip", "Fastest", $true)
Смотрите Перечисление уровня сжатия
Для тестирования я использовал структуру папок, в которой пуста только подпапка D:Testzipfolder1folder1-1
:
D:TESTZIP | the only file in the root directory.txt | ---folder1 ---folder1-1 ---folder1-2 just a single file here.txt
result.zip
Файл впоследствии содержал пустую папку просто отлично..
Комментарии:
1. Это хорошее компромиссное решение, но мне нужен оптимальный уровень. В противном случае файл будет слишком тяжелым.
2. @toscanelli Вот почему я добавил ссылку на уровень сжатия . Просто измените
"Fastest"
на"Optimal"
3. Ах, извините, я понял, что хитрость заключалась в снижении уровня сжатия. Я вижу, вы добавляете ссылку вручную. Я добавил без полного пути (Add-Type -Assembly System.IO.Compression. Файловая система), потому что я не буду знать, на какой ОС будет запущен (Windows наверняка, но не знаю версию …). Я все равно попробую.
4. Это здорово, но вы можете упростить AddType до
Add-Type -AssemblyName System.IO.Compression.FileSystem