Я выполняю следующий код, пытающийся выполнить команду 7z.exe для распаковки файлов.powershell Выполнение внешней команды, не принимающей параметр
$ dir содержит пользовательский ввод пути к zip-файлу, который может содержать пробелы, конечно! и $ dir \ temp2 ниже - это каталог, который я ранее создал.
Get-ChildItem -path $dir -Filter *.zip |
ForEach-Object {
$zip_path = """" + $dir + "\" + $_.name + """"
$output = " -o""$dir\temp2"""
&7z e $zip_path $output
}
, когда я исполняю его я получаю следующее из 7z.exe
7-Zip [64] 9.20 Copyright (C) 1999-2010 Игорь Павлов 2010-11-18
обработки архива C: \ тест реж \ test.zip
нет файлов для обработки
файлов: 0 Размер: 0 Сжатый: 50219965
если я затем скопирую значение из $ zip_path и $ output, чтобы сформировать свою собственную строку cmd, РАБОТАЕТ!
, например: 7z е "с: \ тест реж \ test.zip" -o "C: \ выход тест"
сейчас, я могу воспроизвести то же самое сообщение "нет файлов для обработки" я получаю когда я выполняю в powershell, используя следующий cmd в cli.
7z е "с: \ тест реж \ test.zip" о "C: \ тест выхода"
SO, кажется, что PowerShell является удаление приборную полукокса из моей опции -o. и да, это должно быть -o "C: \ test output", а не -o "c: \ test output" с 7z.exe между параметром -o и его значением нет пробела.
Я в тупике, я делаю что-то неправильно или должен ли я делать это по-другому? любые предложения или помощь благодаря
спасибо вы. это сработало отлично. мне пришлось перевернуть массив args, -o занимает второе место, а первому параметру нужно «e», как это («e» {0} \ {1} "'-f $ dir,' temp2 '). еще раз спасибо –
'&' - оператор вызова, который не анализирует команду (см. ['about_Operators'] (http://go.microsoft.com/fwlink/?LinkID=113242)). Если у вас возникли проблемы с его использованием, тогда пункт ** 1.3 ** или пункт ** 2 ** в [мой ответ на вызов msbuild с вложенными кавычками] (http://stackoverflow.com/a/8468690/2495) могут быть полезны. –
Это решение обладает дополнительным преимуществом, препятствующим хостам проглатывать stderr и stdout. Например, git.exe выдает весь подробный вывод stderr, который заставляет ISE бросать RemoteException или какую-то такую глупость. – Eris