powershell - Invoke-Expression 设计用于什么场景?

标签 powershell

9/10次如果您尝试使用Invoke-Expression cmdlet,有更好的方法。动态构建命令的参数?使用参数数组。构建 cmdlet 的参数?对数组或哈希表使用展开。您的命令的路径中有空格吗?使用调用运算符 (&)。

这可能看起来是开放式的,但 Invoke-Expression 是一个易于访问的 cmdlet,答案几乎总是永远不要使用它。但该 cmdlet 的存在是有原因的,并未被弃用,而且大多数对其使用的批评都指出了类似“它几乎从来都不是正确的答案”,但从未说明何时可以接受使用它。在什么情况下可以使用Invoke-Expression?或者说得更公开一些,Invoke-Expression 是如何设计使用的?

最佳答案

更新:现已推出官方深入主题:Avoid using Invoke-Expression

<小时/>

引用标题为 Invoke-Expression considered harmfulPowerShell 团队博客文章 (强调):

The bottom line: Invoke-Expression is a powerful and useful command for some scenarios such as creating new scripts at runtime, but in general, if you find yourself using Invoke-Expression, you should ask yourself, or maybe a respected colleague if there is a better way.

EBGreen备注:

Or to phrase it another way, It [Invoke-Expression] is ok to use as long as a user is never involved in any part of generating the string that will be invoked. But even then, not using it will enforce better habits than using it would.

简而言之:

  • 作为习惯问题,始终首先考虑不同的(通常更强大和安全)解决方案

  • 如果您确实发现 Invoke-Expression 是您唯一的选择,请仔细考虑安全隐患:如果来自(不受信任的)外部源的字符串(例如,用户输入)直接传递给 Invoke-Expression,可以执行任意命令。

    • 因此:仅当您完全控制或隐式信任输入时才使用 Invoke-Expression
<小时/>

罕见合理(安全)使用Invoke-Expression的示例:

关于powershell - Invoke-Expression 设计用于什么场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51252465/

相关文章:

powershell - 如何在PowerShell中 “grep”并显示周围的行/上下文?

powershell - 如何使用 powershell 轮询 kudu api 响应以获取部署状态

arrays - PowerShell/CLI : "Foreach" loop with multiple arrays

powershell - 了解 get-culture 命令

azure - 用于禁用 Azure 数据工厂的网络设置的 Power shell 命令

用于打印所有子文件夹的 PowerShell 脚本

object - 在 PowerShell 中使用多个参数实现自己的方法

PowerShell:组合两个哈希表

powershell - 为什么PowerShell .Split()也拆分新行?

tfs - 如何使用 PowerShell 更新以前 TFS 构建的构建质量?