Wykonywanie polecenia przechowywanego w zmiennej w programie PowerShell

152

Mam polecenie, które zbudowałem i zapisałem w zmiennej w programie PowerShell. To polecenie działa, jeśli wykonam Write-Host i skopiuję i wkleję do standardowego cmd.exeokna.

Jak wykonać to polecenie z wnętrza mojego skryptu?

Próbowałem kilku kombinacji Invoke-Command lub Invoke-Expression bez powodzenia.

Oto jak zbudowałem zmienną:

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

Oto jak wygląda zmienna, jeśli jest drukowana na ekranie:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log
Travis
źródło

Odpowiedzi:

207

Oto jeszcze inny sposób bez, Invoke-Expressionale z dwiema zmiennymi (polecenie: ciąg i parametry: tablica). U mnie działa dobrze. Załóżmy, że 7z.exeznajduje się w ścieżce systemowej.

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

& $cmd $prm

Jeśli polecenie jest znane (7z.exe) i tylko parametry są zmienne, to wystarczy

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

& 7z.exe $prm

Swoją drogą, Invoke-Expressionz jednym parametrem też u mnie działa np. To działa

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

Invoke-Expression $cmd

PS Zwykle wolę sposób z tablicą parametrów, ponieważ łatwiej jest komponować programowo niż budować wyrażenie dla Invoke-Expression.

Roman Kuzmin
źródło
To wspaniale. Teraz zaczyna się zbierać. Czy zamiast „c: \ temp \ ze spacją \ test1.zip” mogę po prostu użyć zmiennej $? Czy muszę umieścić to „” lub „”?
Travis
Splatting wydaje się działać tak samo: & $ cmd @prm Ale jestem ciekawy, dlaczego tak jest
C2H5OH
44

Spróbuj wywołać swoje polecenie za pomocą Invoke-Expression:

Invoke-Expression $cmd1

Oto działający przykład na moim komputerze:

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

iexJest to alias dla Invoke-Expressiontak można zrobić:

iex $cmd1

Aby uzyskać pełną listę: Odwiedź https://ss64.com/ps/, aby uzyskać więcej informacji Powershell.

Powodzenia...

kbrimington
źródło
Mówi mi Termin „7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log” nie jest rozpoznawany jako nazwa polecenia cmdlet, funkcja, plik skryptu lub program operacyjny. Sprawdź pisownię nazwy lub, jeśli ścieżka została dołączona, sprawdź, czy jest ona poprawna i spróbuj ponownie. At: line: 14 char: 1 + & <<<< $ cmd1
Travis
@Travis: Ups. znak ampersand działa, jeśli nie ma argumentów. Zaktualizowałem post o rozwiązanie dla twojego polecenia.
kbrimington
Próbowałem już wcześniej wywołać wyrażenie, ale nie zadziałało. Wypluwa błąd: Zła stała numeryczna: 7. At: line: 1 char: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Wygląda na to, że próbuje go ocenić, zamiast go wykonać.
Travis
@Travis: Możliwe, że na twojej ścieżce nie ma 7z.exe. Sprawdź, czy znajduje się na ścieżce i / lub spróbuj podać pełną nazwę ścieżki do pliku wykonywalnego w wyrażeniu.
kbrimington
1
@Travis: Właśnie potwierdziłem na własnym systemie, że 7z.exe dał opisany przez ciebie błąd, po prostu pisząc z wiersza poleceń, ale z pełną ścieżką do 7z.exe (dla mnie było to 'C:\Program Files\7-zip\7z.exe', mogłem uruchomić 7z.exe.
kbrimington