Извлечение содержимого из архивных файлов на месте с помощью 7-Zip и PowerShell

Я хочу извлечь все файлы * .Z в их текущие каталоги (7-Zip поддерживает сжатие LZW / UNIX).

Я не могу понять, почему это не работает. Я знаю, как использовать PowerShell для рекурсивного получения полного пути к имени файла и каталогу, в котором находится файл. Я также знаю, как использовать 7-zip для извлечения файла на место. Но попытаться соединить эти два вместе не работает. Вот что у меня есть:

Get-ChildItem -Recurse *.Z | foreach ($_) {7z.exe e $_.FullName -o$_.Directory}

Я также пробовал:

Get-ChildItem -Recurse *.Z | foreach ($_) {7z.exe e $_.FullName -o$($_.Directory)}

и

Get-ChildItem -Recurse *.Z | foreach ($_) {7z.exe e $_.FullName -o${_.Directory}}

Я получаю файлы к FullName, а Directory - правильный путь (без пробела между буквой o и directory - это то, как 7-zip ожидает выходной каталог). Однако он продолжает попытки вывести файл по пути .Z, а не в каталог. Я знаю, что это правильно, если я это сделаю

Get-ChildItem -Recurse *.Z | Select Directory

вот куда я хочу его пойти.

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

Таким образом, проблема в том, что 7-zip сообщает, что файлы для обработки отсутствуют, когда я хочу вывести в тот же каталог, но не знаю, почему, и кажется, что переменная Directory не передается, а снова имя файла, что не имеет смысла. Пример вывода для каждого файла:

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21

Scanning the drive for archives:
1 file, 226 bytes (1 KiB)

Extracting archive: E:\Files\2014\more_cowbell\myfancyunixcompresseddocument.txt.Z
--
Path = E:\Files\2014\more_cowbell\myfancyunixcompresseddocument.txt.Z
Type = Z


No files to process
Everything is Ok

Files: 0
Size:       0
Compressed: 226

Он отлично работает, если я укажу один конкретный выходной каталог (без переменной), но я хочу, чтобы они были извлечены на месте из-за множества подкаталогов и конфликтующих имен файлов между ними.

Я хочу извлечь все файлы * .Z в их текущие каталоги (7-Zip поддерживает сжатие LZW / UNIX).


person Bob Dylan    schedule 07.08.2016    source источник


Ответы (1)


Параметр -o должен быть внутри строки в двойных кавычках с $($var) для переменных:

Get-ChildItem -Recurse *.z | %{ 7z e $_.FullName "-o$($_.Directory)"}
person wOxxOm    schedule 07.08.2016
comment
Возможно, стоит добавить -File к команде Get-ChildItem, чтобы ограничить ее только файлами. - person icirellik; 22.12.2019