如果您尝试使用Invoke-Expression
cmdlet,则有9/10次,有更好的方法.动态构建命令的参数?使用参数数组.构建cmdlet的参数?使用splatting与数组或哈希表.你的命令在它的路径中有空格?使用call运算符(&
).
这似乎是开放式的,但它Invoke-Expression
是一个易于访问的cmdlet,答案几乎总是永远不会使用它.但是cmdlet存在是有原因的,并没有被弃用,并且大多数批评它的使用状态类似于"它几乎从来都不是正确的答案",但从未说明何时可以使用它.在什么情况下可以使用Invoke-Expression
?或者说它不那么公开,如何Invoke-Expression
设计使用?
引用名为Invoke-Expression的PowerShell团队博客文章认为有害(强调添加):
底线:对于某些场景,例如在运行时创建新脚本, Invoke-Expression是一个功能强大且有用的命令,但一般来说,如果你发现自己使用了Invoke-Expression,你应该问问自己,或者如果有的话,可能是一个受人尊敬的同事更好的方法.
EBGreen指出:
或者用另一种方式表达它,只要用户从不参与生成将被调用的字符串的任何部分,它就可以使用它[Invoke-Expression].但即便如此,不使用它会比使用它更能实现更好的习惯.
简而言之:
作为习惯问题,首先要考虑不同的(通常更强大和安全)解决方案.
如果您确实发现这Invoke-Expression
是您唯一的选择,请仔细考虑安全隐患:如果来自(不可信的)外部源(例如,用户输入)的字符串直接传递给Invoke-Expression
,则可以执行任意命令.
注意:从Windows PowerShell v5.1/PowerShell Core v6.1.0开始,官方Invoke-Expression
帮助主题不提供此类指导; 这个GitHub问题建议纠正这个问题.
合理(安全)使用的罕见例子Invoke-Expression
:
归档时间: |
|
查看次数: |
130 次 |
最近记录: |