应只将 Invoke-Expression cmdlet 在不得已的情况下采用的手段。 在大多数情况下,有更安全、更可靠的替代方法。 Stack Overflow 等论坛中有大量 Invoke-Expression 滥用的示例。 另请注意,PSScriptAnalyzer 对此有一个规则。 有关详细信息,请参阅 AvoidUsingInvokeExpression。
仔细考虑安全隐患。 将来自不受信任的源(例如用户输入)的字符串直接传递至 Invoke-Expression 时,可以执行任意命令。 始终先考虑其他更可靠、更安全的解决方案。
常见方案
请考虑以下使用场景:
重定向 PowerShell 来自然地执行操作更简单。 例如:
Get-Content ./file.ps1 | Invoke-Expression这些情况是可避免的。 脚本或代码已存在于文件或 AST 窗体中,因此应编写包含参数的脚本并直接调用它,而不是对字符串使用
Invoke-Expression。从受信任的源运行脚本。 例如,从 PowerShell 存储库运行安装脚本:
Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression只能以交互方式使用它。 虽然这确实可简化操作,但应劝阻这种做法。
测试是否有分析错误。 PowerShell 团队使用
Invoke-Expression测试源代码中的分析错误,因为只有这样才能将分析时错误转换为运行时错误。
结束语
其他大多数脚本语言都有一种方法将字符串作为代码进行评估,而作为解释的语言,PowerShell 必须有一种方法来动态运行其自身。 但是,没有充分的理由在生产环境中使用 Invoke-Expression。
参考
- Stack Overflow 讨论 - In what scenario was Invoke-Expression designed to be used?(Invoke-Expression 设计用于哪种场景?)
- PowerShell 博客文章 - Invoke-Expression 被视为有害