Выполнение команды, хранящейся в переменной из PowerShell

152

У меня есть команда, которую я собрал и сохранил в переменной в PowerShell. Эта команда работает, если я делаю Write-Host и копирую и вставляю в стандартное cmd.exeокно.

Как мне выполнить эту команду из моего скрипта?

Я попробовал несколько комбинаций Invoke-Command или Invoke-Expression без удачи.

Вот как я построил переменную:

$cmd1 = $arcprg + $arcdir + "\" + $site1 + "-" + $hst + "-" + $yesterday + ".zip " + $logpath1 + "u_ex" + $yesterday + ".log"

Вот как выглядит переменная, если она выводится на экран:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log
Travis
источник

Ответы:

208

Вот еще один способ без, Invoke-Expressionно с двумя переменными (команда: строка и параметры: массив). Он отлично работает для меня. Предположим, 7z.exeнаходится в системном пути.

$cmd = '7z.exe'
$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& $cmd $prm

Если команда известна (7z.exe) и только параметры являются переменными, это будет делать

$prm = 'a', '-tzip', 'c:\temp\with space\test1.zip', 'C:\TEMP\with space\changelog'

& 7z.exe $prm

Кстати, Invoke-Expressionс одним параметром работает у меня тоже, например, это работает

$cmd = '& 7z.exe a -tzip "c:\temp\with space\test2.zip" "C:\TEMP\with space\changelog"'

Invoke-Expression $cmd

PS Я обычно предпочитаю способ с массивом параметров, потому что это проще составить программно, чем создать выражение для Invoke-Expression.

Роман Кузьмин
источник
Это отлично. Это начинает собираться вместе сейчас. Вместо 'c: \ temp \ with space \ test1.zip' я могу просто использовать переменную $? Нужно ли размещать это "" или "?
Трэвис
Кажется, что Splatting работает одинаково: & $ cmd @prm Но мне интересно, почему это так
C2H5OH
44

Попробуйте вызвать вашу команду с помощью Invoke-Expression:

Invoke-Expression $cmd1

Вот рабочий пример на моей машине:

$cmd = "& 'C:\Program Files\7-zip\7z.exe' a -tzip c:\temp\test.zip c:\temp\test.txt"
Invoke-Expression $cmd

iexявляется псевдонимом для Invoke-Expressionтак что вы можете сделать:

iex $cmd1

Для получения полного списка: посетите https://ss64.com/ps/ для получения дополнительной информации Powershell.

Удачи...

kbrimington
источник
Говорит мне, что термин «7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log» не распознается как имя Командлет, функция, файл сценария или работающая программа. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку. На: строка: 14 символов: 1 + & <<<< $ cmd1
Трэвис
@ Travis: Упс. амперсанд работает, если нет аргументов. Я обновил пост с решением для вашей команды.
Кбримингтон
Я пробовал вызывать выражение раньше, и это не сработало. Выдает ошибку: Неверная числовая константа: 7. В: строка: 1 символ: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Почти кажется, что он пытается оценить его, а не выполнить.
Трэвис
@Travis: Может быть, 7z.exe не на вашем пути. Убедитесь, что он находится по пути, и / или попробуйте указать полный путь к исполняемому файлу в вашем выражении.
Кбримингтон
1
@Travis: Я только что подтвердил в своей системе, что 7z.exe выдал ошибку, которую вы описали, просто набрав в командной строке, но с полным путем до 7z.exe (для меня это было возможно 'C:\Program Files\7-zip\7z.exe', я мог выполнить 7z.exe.
Кбримингтон