Виконання команди, що зберігається у змінній від 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

Відповіді:


207

Ось ще один спосіб без 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 \ з пробілом \ test1.zip' я можу просто використовувати змінну $? Чи потрібно мені розміщувати це "" чи ""?
Тревіс

Бризки, схоже, працюють так само: & $ 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.

Щасти...


Розказує мені Термін '7z.exe -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' не визнається іменем командлет, функція, файл сценарію або операційна програма. Перевірте написання імені або якщо шлях включений, перевірте, чи правильний шлях, і спробуйте ще раз. На: рядок: 14 char: 1 + & <<<< $ cmd1
Тревіс

@Travis: На жаль. ampersand - це робота, якщо немає аргів. Я оновив пост з рішенням для вашої команди.
kbrimington

Я раніше спробував вираз-вираз, і він не спрацював. Він випускає помилку: Неправильна числова константа: 7. У: рядок: 1 char: 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 не на вашому шляху. Переконайтеся, що він стоїть на шляху та / або спробуйте дати повне ім'я шляху виконуваному у своєму виразі.
kbrimington

1
@Travis: Я щойно підтвердив у власній системі, що 7z.exe видав описану вами помилку, просто ввівши командний рядок, але з повним шляхом до 7z.exe (для мене це було 'C:\Program Files\7-zip\7z.exe', я міг би виконати 7z.exe.
kbrimington
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.