2010-08-28 12 views
104

Tengo un comando que tengo compilado y almacenado en una variable en power shell. Este comando funciona si hago un write-host y lo copio y lo paso a una ventana estándar de cmd.exe.Ejecutando un comando almacenado en una variable de Powershell

¿Cómo ejecuto este comando desde dentro de mi script?

He intentado varias combinaciones de invoke-command o invoke-expression sin suerte.

Éste es cómo construí la variable:

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

Esto es lo que se ve como 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 

Respuesta

136

Aquí es otra manera sin Invoke-Expression pero con dos variables (command: String     y parámetros: matriz). Funciona bien para mí. Supongamos 7z.exe 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 el comando se conoce (7z.exe) y sólo los parámetros son variables, entonces no sucederá

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

& 7z.exe $prm 

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

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

Invoke-Expression $cmd 

P.S. Normalmente prefiero el camino con una matriz de parámetros porque es más fácil componer programáticamente que construir una expresión para Invoke-Expression.

+0

Eso es genial. Está empezando a unirse ahora. En lugar de 'c: \ temp \ con espacio \ test1.zip', ¿puedo usar una variable $? ¿Debo colocarlo en "" o "? – Travis

+0

+1 para la técnica de matriz, esta es mi forma preferida de hacerlo. –

+0

Splatting parece funcionar de la misma manera: & $ cmd @prm Pero tengo curiosidad acerca de por qué es eso – C2H5OH

22

Trate de invocar el comando con invoke-expression.

invoke-expression $cmd1 

Aquí es 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 
+0

Me dice 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 y vuelva a intentarlo. En: línea: 14 caracteres: 1 + y <<<< $ cmd1 – Travis

+0

@Travis: Vaya. el ampersand funciona si no hay argumentos. Actualicé la publicación con una solución para tu comando. – kbrimington

+0

He intentado invoke-expression antes y no funcionó. Escupe el error: Mala constante numérica: 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 Parece que intenta evaluarlo en lugar de ejecutarlo. – Travis

Cuestiones relacionadas