Esecuzione di un comando memorizzato in una variabile da PowerShell


152

Ho un comando che ho creato e archiviato in una variabile in PowerShell. Questo comando funziona se faccio un Write-Host e copia e incolla in una cmd.exefinestra standard .

Come eseguo questo comando dall'interno del mio script?

Ho provato diverse combinazioni di Invoke-Command o Invoke-Expression senza fortuna.

Ecco come ho creato la variabile:

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

Ecco come appare la variabile se viene stampata sullo schermo:

7z.exe a -tzip c:\arc_logs\site-host-at-web1-100827.zip c:\inetpub\logs\logfiles\w3svc1\u_ex100827.log

Risposte:


207

Ecco un altro modo senza Invoke-Expressionma con due variabili (comando: stringa e parametri: matrice). Funziona bene per me. Supponiamo che 7z.exesia nel percorso di sistema.

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

& $cmd $prm

Se il comando è noto (7z.exe) e solo i parametri sono variabili, lo farà

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

& 7z.exe $prm

A proposito, Invoke-Expressioncon un parametro funziona anche per me, ad esempio questo funziona

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

Invoke-Expression $cmd

PS Di solito preferisco il modo con un array di parametri perché è più facile comporre in modo programmatico piuttosto che creare un'espressione per Invoke-Expression.


È grandioso. Sta iniziando a riunirsi ora. Invece di 'c: \ temp \ with space \ test1.zip' posso semplicemente usare una variabile $? Devo posizionarlo è "" o ''?
Travis,

Splatting sembra funzionare allo stesso modo: & $ cmd @prm Ma sono curioso di sapere perché
C2H5OH

44

Prova a invocare il tuo comando con Invoke-Expression:

Invoke-Expression $cmd1

Ecco un esempio funzionante sulla mia macchina:

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

iexè un alias per Invoke-Expressioncui potresti fare:

iex $cmd1

Per un elenco completo: visitare https://ss64.com/ps/ per ulteriori informazioni Powershell.

In bocca al lupo...


Mi dice che il termine '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' non è riconosciuto come il nome di un cmdlet, funzione, file di script o programma eseguibile. Controlla l'ortografia del nome o se è stato incluso un percorso, verifica che il percorso sia corretto e riprova. A: linea: 14 caratteri: 1 + & <<<< $ cmd1
Travis

@Travis: Oops. la e commerciale funziona se non ci sono argomenti. Ho aggiornato il post con una soluzione per il tuo comando.
kbrimington,

Ho provato invoke-expression prima e non ha funzionato. Risolve l'errore: costante numerica errata: 7. A: riga: 1 carattere: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Sembra quasi che stia cercando di valutarlo invece di eseguirlo.
Travis,

@Travis: 7z.exe potrebbe non essere sul tuo percorso. Verifica che si trovi sul percorso e / o prova a dare il nome completo del percorso all'eseguibile nella tua espressione.
kbrimington,

1
@Travis: Ho appena confermato sul mio sistema che 7z.exe ha dato l'errore che hai descritto, digitando semplicemente dal prompt dei comandi, ma con il percorso completo di 7z.exe (per me, è stato 'C:\Program Files\7-zip\7z.exe'possibile eseguire 7z.exe.
kbrimington,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.