Как расширить ZIP-архив с помощью PowerShell (имена файлов UTF-8) - PullRequest
3 голосов
/ 15 февраля 2020

В моем zip-архиве есть один файл:

Père-Noël.txt

Zip прекрасно расширяется с помощью Windows File Explorer, 7-Zip или любого другого инструмента, который я пробовал. Но я не могу понять, как это сделать из PowerShell. Очевидно, я пробовал Expand-Archive , но он не может обработать имя файла и переносит его в PŠre-N”el.txt. Примечание. Проблема не только в этом примере, но и в любом имени файла, в котором используются символы вне диапазона ASCII-127. Или так кажется.

Любое решение, которое использует PowerShell и не использует внешний инструмент, присутствие которого не может быть гарантировано, будет принято. Windows 10 - платформа. Я не могу вносить изменения на уровне системы и не могу полагаться на пользователей сценария, имеющих какие-либо определенные глобальные настройки c в своей системе. Это должно быть решение в сценарии.

Есть ли другой способ, кроме Expand-Archive? Или в PowerShell есть настройка, которая волшебным образом поможет?

Шаги для воспроизведения:

На вашем Windows 10 хосте:

  1. Создайте пустой файл с именем Père-Noël.txt.

  2. ZIP файл с помощью Windows Explorer (функция «Сжатые папки») в ZIP-архив по вашему выбору, скажем myarchive.zip.

  3. Удалите файл Père-Noël.txt.

  4. Теперь попробуйте распаковать myarchive.zip с помощью PowerShell. Эта операция должна снова создать файл Père-Noël.txt.

Сжатие с помощью командлета PowerShell Compress-Archive

True, если ZIP изначально был создан с помощью командлета Compress-Archive, то на самом деле он работает как задумано при распаковке с использованием Expand-Archive. Таким образом, вы можете сказать, что PowerShell совместим с самим собой. Он просто не совместим с Windows Explorer ZIP.

1 Ответ

1 голос
/ 15 февраля 2020

Возможно, вам потребуется проверить кодировку [System.Text.Encoding]::GetEncodings(), но приведенный ниже работает с вашим примером Père-Noël

$zipfile = 'C:\test\Père-Noël.zip' #Contains Père-Noël.txt
$outpath = 'C:\test\out'
$enc = [System.Text.Encoding]::GetEncoding(29001) #29001, x-Europa, Europa
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath, $enc)

Надеюсь, это поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...