El cmdlet Invoke-Expression de PowerShell puede ser fácil de malinterpretar cuándo y cuándo no usarlo. En este artículo, he recopilado una serie de preguntas frecuentes principales. Voy a desglosarlas e incluir un montón de ejemplos útiles para que los consultes siempre que los necesites. Esto significa que debes marcar esta página ahora mismo!
¿Quieres más consejos como este? Visita mi blog personal de PowerShell en: https://www.nkasco.com/
¿Qué es Invoke-Expression
?
La descripción oficial, según Microsoft, es: “El cmdlet Invoke-Expression evalúa o ejecuta una cadena especificada como un comando y devuelve los resultados de la expresión o comando. Sin Invoke-Expression, una cadena enviada en la línea de comandos se devolvería (eco) sin cambios”.
En otras palabras, puede ser útil para llamar a código dentro de un script o construir comandos que se ejecutarán más tarde. También se puede usar con precaución en combinación con la entrada proporcionada por el usuario.
El ejemplo más básico de uso de Invoke-Expression es definir un script y pasar esa cadena al parámetro Command. Luego, Invoke-Expression ejecuta esa cadena.
¿Qué pasa si tengo espacios en la ruta de mi script?
Asegúrate de encerrar las cadenas entre comillas simples o dobles.
Por ejemplo, si deseas ejecutar una cadena con un espacio en la ruta, estas opciones no funcionarán:
¿Por qué? Porque esto es exactamente lo mismo que escribir directamente esto en la consola de PowerShell:
Sin embargo, si encierras el elemento de la ruta entre comillas simples o dobles con toda la cadena en comillas, Invoke-Expression
ejecutará el script como se espera.
Q. How do you pass parameters to scripts invoked with Invoke-Expression
?
El único parámetro que tiene Invoke-Expression
es Command
. No hay una manera nativa de pasar parámetros con Invoke-Expression
. Sin embargo, en su lugar, puedes incluirlos en la cadena que pasas al parámetro Command
.
Tal vez tengas un script con dos parámetros llamados Path
y Force
. En lugar de usar un parámetro específico a través de Invoke-Expression
, puedes pasar parámetros a ese script pasándolos como típicamente lo harías a través de la consola.
Si típicamente llamarías a este script de esta manera a través de la consola:
Tienes que incluir toda esa línea en una cadena y luego pasar esa cadena al parámetro Command
.
¿Tiene sentido utilizar try/catch con Invoke-Expression?
No realmente. Esto significa que debes utilizar manejo de errores dentro de tu parámetro Command
.
Ejemplo:
¿Cuál es la diferencia entre Invoke-Expression
y el operador de llamada (&
)?
El operador de llamada (&) es excelente para ejecutar rápidamente un comando, script o bloque de script. Sin embargo, el operador de llamada no analiza el comando. No puede interpretar los parámetros del comando como puede hacerlo Invoke-Expression.
Por ejemplo, quizás desee obtener el proceso de PowerShell Core usando el cmdlet Get-Process
con el código Get-Process -ProcessName pwsh
. Concatenar Get-Process
y el parámetro no funcionará como se espera utilizando el operador de llamada.
Pero si ejecutas esta cadena con Invoke-Expression
, funcionará como se espera.
¿Cuál es la diferencia entre Invoke-Expression
y Start-Process
?
El cmdlet Start-Process
proporciona un código de retorno o salida en el objeto devuelto. Te permite esperar a que el proceso llamado se complete y permite iniciar un proceso con una credencial de Windows diferente. Invoke-Expression
es rápido y sencillo, mientras que Start-Process
puede ser más útil para interpretar los resultados del proceso ejecutado.
¿Cuál es la diferencia entre Invoke-Expression
y Invoke-Command
?
Invoke-Expression
solo “convierte” una cadena en código ejecutable. Invoke-Command
, por otro lado, aprovecha PowerShell Remoting dándote la capacidad de invocar código local o remotamente en computadoras.
Invoke-Command
es preferible si estás escribiendo los comandos ejecutados ahora, ya que conservas la intellisense en tu IDE, mientras que Invoke-Expression
sería preferible si quisieras llamar a otro script desde el actual.
Ejemplo:
¿Cuál es la diferencia entre Invoke-Expression
y Invoke-Item
?
El cmdlet Invoke-Item
te brinda soporte en línea para múltiples rutas para abrir documentos con su acción predeterminada, con parámetros para incluir, excluir, agregar credenciales e incluso confirmación para seguridad adicional.
¿Es seguro Invoke-Expression?
A. If someone had malicious intent they might be able to trick some virus programs by masking malicious code that constructs itself during runtime. Invoke-Expression
will happily execute whatever text is passed to it’s Command
parameter.
Ejemplo:
¿Cuáles son algunas mejores prácticas para ejecutar múltiples comandos/expresiones?
Si tienes varios comandos para ejecutar, aunque Invoke-Expression
solo acepta una cadena en lugar de un array, podemos usar el pipeline de PowerShell para enviar objetos por el pipeline uno a la vez.
Ejemplo:
Cómo puedo usar Invoke-Expression
con la entrada del usuario?
Deberías ser muy cauteloso al usar Invoke-Expression con la entrada del usuario. Si permites un aviso a un usuario de una manera que les dé acceso fuera del comando que pretendes ejecutar, podría crear una vulnerabilidad no deseada. Aquí hay una forma en que puedes implementar de manera segura la entrada del usuario con Invoke-Expression
.
Conclusión
Cada cmdlet tiene su lugar y Invoke-Expression
es uno con el que casi todos se encontrarán en algún momento u otro. Es importante entender los pros y los contras de los cmdlets frecuentemente utilizados para implementarlos de una manera que te prepare para el éxito. Me gustaría escuchar cómo has utilizado Invoke-Expression
para resolver algunos de tus propios desafíos, deja un comentario abajo y comparte tu historia!
¿Quieres más consejos como este? Echa un vistazo a mi blog personal de PowerShell en: https://www.nkasco.com/