2011-07-06 17 views
22

Usando powershell, puede usar el caracter '&' para ejecutar otra aplicación y pasar los parámetros.Genere dinámicamente el comando de la línea de comando, luego invoque usando powershell

Un ejemplo simple.

$notepad = 'notepad' 
$fileName = 'HelloWorld.txt' 

# This will open HelloWorld.txt 
& $notepad $fileName 

Esto es bueno. Pero, ¿qué ocurre si quiero usar la lógica empresarial para generar dinámicamente una cadena de comandos? Usando el mismo ejemplo sencillo:

$commandString = @('notepad', 'HelloWorld.txt') -join ' '; 
& $commandString 

me sale el error:

The term 'notepad HelloWorld.txt' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

En mi ejemplo real estoy tratando de añadir o eliminar dinámicamente opciones para la cadena de línea de comandos final. ¿Hay alguna manera de hacerlo?

+0

¿Se citar entre comillas dobles ("") ayuda? – cristobalito

Respuesta

25

dos maneras de hacerlo:

independiente del exe de los argumentos. hacer todas sus cosas dinámico para los argumentos, pero llamar al exe de forma normal con la variable que contiene los argumentos después:

$argument= '"D:\spaced path\HelloWorld.txt"' 
$exe = 'notepad' 
&$exe $argument 

#or 
notepad $argument 

Si usted tiene más de un argumento, usted debe hacer una matriz si será separada exe de la parte de la llamada:

$arguments = '"D:\spaced path\HelloWorld.txt"','--switch1','--switch2' 
$exe = 'notepad' 
&$exe $arguments 

uso Invoke-expresión. Si todo debe estar en una cadena, puede invocar la cadena como si fuera una expresión normal. Invoke-Expression también tiene el alias de iex.

$exp = 'notepad "D:\spaced path\HelloWorld.txt"' 
Invoke-Expression $exp 

En cualquier caso, los contenidos de los argumentos y de la exe debe ser citado y formateadas apropiadamente como si se estuviera escrita directamente en la línea de comandos.

+1

Tenga en cuenta también que debe citar argumentos dentro de la cadena individual para asegurarse de que se pasen correctamente. – Joey

+0

Gracias. Esta pregunta me dio tres alternativas utilizables, pero finalmente fui con el camino "Separar el exe de los argumentos". –

+0

@Andrew: uso ese enfoque la mayor parte del tiempo, también, ya que la mayoría de los idiomas tienen una separación similar para iniciar otros procesos. –

4

Si desea mantener esa lógica para la construcción de sus cadenas:

$commandString = @('notepad', 'HelloWorld.txt') -join ' ' 

&([scriptblock]::create($commandstring)) 
Cuestiones relacionadas