Puedo expresar mi necesidad con el siguiente escenario: Escriba una función que acepte una cadena para ejecutarse como un comando nativo.
No es una idea demasiado descabellada: si está interactuando con otras utilidades de línea de comandos de otras partes de la compañía que le proporcionan un comando para ejecutar textualmente. Debido a que no controla el comando, debe aceptar cualquier comando válido como entrada . Estos son los principales problemas que no he podido superar fácilmente:
El comando podría ejecutar un programa que vive en una ruta con un espacio en él:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
El comando puede tener parámetros con espacios en ellos:
$command = 'echo "hello world!"';
El comando puede tener marcas simples y dobles:
$command = "echo `"it`'s`"";
¿Hay alguna forma limpia de lograr esto? Solo he sido capaz de idear soluciones fastuosas y feas, pero para un lenguaje de script creo que esto debería ser muy simple.
fuente
eval
cosas son medio bromistas porque así se llama en muchos otros lenguajes de scripting, y esta no es la primera pregunta que he visto sobre alguien que no tenía ideainvoke-expression
. Y el caso del OP suena solo como guión interno.Invoke-Expression "& $command"
Consulte también este informe de Microsoft Connect sobre, esencialmente, cuán difícil es usar PowerShell para ejecutar comandos de shell (oh, la ironía).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Sugieren usarlo
--%
como una forma de obligar a PowerShell a dejar de intentar interpretar el texto a la derecha.Por ejemplo:
fuente
La respuesta aceptada no funcionaba para mí cuando intentaba analizar el registro para desinstalar cadenas y ejecutarlas. Resulta que no necesitaba la llamada para
Invoke-Expression
después de todo.Finalmente encontré esta bonita plantilla para ver cómo ejecutar cadenas de desinstalación:
Esto funciona para mí, es decir, porque
$app
es una aplicación interna que sé que solo tendrá dos argumentos. Para cadenas de desinstalación más complejas, es posible que desee utilizar el operador de combinación . Además, acabo de usar un mapa hash, pero en realidad, probablemente quieras usar una matriz.Además, si tiene instaladas varias versiones de la misma aplicación, este desinstalador las recorrerá todas a la vez, lo cual es confuso
MsiExec.exe
, por lo que también está eso.fuente
Si desea utilizar el operador de llamada, los argumentos pueden ser una matriz almacenada en una variable:
El operador de llamada también funciona con objetos ApplicationInfo.
fuente