在什么情况下设计使用`Invoke-Expression`?

Ben*_*est 5 powershell

如果您尝试使用Invoke-Expressioncmdlet,则有9/10次,有更好的方法.动态构建命令的参数?使用参数数组.构建cmdlet的参数?使用splatting与数组或哈希表.你的命令在它的路径中有空格?使用call运算符(&).

这似乎是开放式的,但它Invoke-Expression是一个易于访问的cmdlet,答案几乎总是永远不会使用它.但是cmdlet存在是有原因的,并没有被弃用,并且大多数批评它的使用状态类似于"它几乎从来都不是正确的答案",但从未说明何时可以使用它.在什么情况下可以使用Invoke-Expression?或者说它不那么公开,如何Invoke-Expression设计使用?

mkl*_*nt0 7

引用名为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:

  • 谢谢,这回答了我的问题,我仍然可以想到除了使用`Invoke-Expression`来运行在Powershell中完全构建的脚本以外的其他技术.所以我的看法是,***总是比"Invoke-Expression"更好的解决方案. (2认同)