9/10次如果您尝试使用Invoke-Expression
cmdlet,有更好的方法。动态构建命令的参数?使用参数数组。构建 cmdlet 的参数?对数组或哈希表使用展开。您的命令的路径中有空格吗?使用调用运算符 (&
)。
这可能看起来是开放式的,但 Invoke-Expression
是一个易于访问的 cmdlet,答案几乎总是永远不要使用它。但该 cmdlet 的存在是有原因的,并未被弃用,而且大多数对其使用的批评都指出了类似“它几乎从来都不是正确的答案”,但从未说明何时可以接受使用它。在什么情况下可以使用Invoke-Expression
?或者说得更公开一些,Invoke-Expression
是如何设计使用的?
最佳答案
更新:现已推出官方深入主题:Avoid using Invoke-Expression
<小时/>引用标题为 Invoke-Expression considered harmful 的 PowerShell 团队博客文章 (强调):
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 初始化代码,
动态创建 PSv5+ 自定义类:
将
Invoke-Expression
与Write-Output
结合使用:至parse a string with embedded quoting ,采取额外的预防措施。
使用
Invoke-Expression
进行嵌套属性访问:
关于powershell - Invoke-Expression 设计用于什么场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51252465/