Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El cmdlet Invoke-Expression solo se debe utilizar como último recurso. En la mayoría de los recursos hay disponibles alternativas más seguras y sólidas. Los foros como Stack Overflow están repletos de ejemplos de uso incorrecto de Invoke-Expression. Tenga en cuenta también que PSScriptAnalyzer tiene una regla para esto. Para obtener más información, vea AvoidUsingInvokeExpression..
Plantéese con atención las implicaciones de seguridad. Cuando una cadena de un origen que no es de confianza, como la entrada de usuario, se pasa directamente a Invoke-Expression, se pueden ejecutar comandos arbitrarios. Plantéese siempre primero una solución diferente, más sólida y segura.
Escenarios comunes
Considere los escenarios de uso siguientes:
Es más sencillo redirigir PowerShell para ejecutar algo de forma natural. Por ejemplo:
Get-Content ./file.ps1 | Invoke-ExpressionEstos casos son extremadamente evitables. El script o código ya existe en el archivo o formulario AST, por lo que debe escribir un script con parámetros e invocarlo directamente en lugar de usar
Invoke-Expressionen una cadena.Ejecución de un script desde un origen de confianza. Por ejemplo, al ejecutar el script de instalación desde el repositorio de PowerShell:
Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-ExpressionSolo debe usar esto de forma interactiva. Y, aunque esto hace que todo sea más sencillo, esta práctica debe desaconsejarse.
Prueba de errores de análisis. El equipo de PowerShell comprueba si hay errores de análisis en el código fuente mediante
Invoke-Expressionporque esa es la única manera de convertir un error en tiempo de análisis en uno en tiempo de ejecución.
Conclusión
La mayoría de los demás lenguajes de scripting tienen una manera de evaluar una cadena como código y, como lenguaje interpretado, PowerShell debe tener una manera de ejecutarse dinámicamente. Pero no hay ningún motivo convincente para usar Invoke-Expression en un entorno de producción.
Referencias
- Explicación de Stack Overflow: ¿En qué escenario está diseñado para usarse Invoke-Expression?
- Entrada de blog de PowerShell: Invoke-Expression se considera dañina