Ejecutar un comando almacenado en una variable desde PowerShell

152

Tengo un comando que he compilado y almacenado en una variable en PowerShell. Este comando funciona si hago un Host de escritura y copio y pego en una cmd.exeventana estándar .

¿Cómo ejecuto este comando desde mi script?

He intentado varias combinaciones de Invoke-Command o Invoke-Expression sin suerte.

Así es como construí la variable:

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

Así es como se ve la variable si se imprime en la pantalla:

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

Respuestas:

207

Aquí hay otra forma sin Invoke-Expressionpero con dos variables (comando: cadena y parámetros: matriz). Funciona bien para mí. Suponga que 7z.exeestá en la ruta del sistema.

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

& $cmd $prm

Si se conoce el comando (7z.exe) y solo los parámetros son variables, esto funcionará

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

& 7z.exe $prm

Por cierto, Invoke-Expressioncon un parámetro también funciona para mí, por ejemplo, esto funciona

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

Invoke-Expression $cmd

PD: Por lo general, prefiero la forma con una matriz de parámetros porque es más fácil componer mediante programación que construir una expresión Invoke-Expression.

Roman Kuzmin
fuente
Eso es genial Está empezando a unirse ahora. En lugar de 'c: \ temp \ with space \ test1.zip', ¿puedo usar una variable $? ¿Necesito colocarlo en "" o ''?
Travis
Las salpicaduras parecen funcionar de la misma manera: & $ cmd @prm Pero tengo curiosidad acerca de por qué es eso
C2H5OH
44

Intenta invocar tu comando con Invoke-Expression:

Invoke-Expression $cmd1

Aquí hay un ejemplo de trabajo en mi máquina:

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

iexes un alias para Invoke-Expressionque puedas hacer:

iex $cmd1

Para obtener una lista completa: visite https://ss64.com/ps/ para obtener más Powershellinformación.

Buena suerte...

kbrimington
fuente
El término '7z.exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log' no se reconoce como el nombre de un cmdlet, función, archivo de script o programa operable. Verifique la ortografía del nombre, o si se incluyó una ruta, verifique que la ruta sea correcta e intente nuevamente. En: línea: 14 caracteres: 1 + & <<<< $ cmd1
Travis
@Travis: ¡Vaya! El ampersand funciona si no hay args. Actualicé la publicación con una solución para su comando.
kbrimington
He intentado invocar-expresión antes y no ha funcionado. Escupe el error: Constante numérica incorrecta: 7. En: línea: 1 char: 2 + 7z <<<< .exe a -tzip c: \ arc_logs \ site-host-at-web1-100827.zip c: \ inetpub \ logs \ logfiles \ w3svc1 \ u_ex100827.log Casi parece que está intentando evaluarlo en lugar de ejecutarlo.
Travis
@Travis: puede ser que 7z.exe no esté en su camino. Verifique que esté en la ruta y / o intente darle el nombre completo de la ruta al ejecutable en su expresión.
kbrimington
1
@Travis: acabo de confirmar en mi propio sistema que 7z.exe dio el error que describiste, simplemente escribí desde el símbolo del sistema, pero con la ruta completa a 7z.exe (para mí, 'C:\Program Files\7-zip\7z.exe'podía ejecutar 7z.exe.
kbrimington