Invoke-Expression
cmdlet,则 9/10次,有更好的方法。动态地建立命令的参数?使用参数数组。构建cmdlet的参数?对数组或哈希表使用散列。您的命令路径中是否有空格?使用呼叫运算符(&
)。
这似乎是开放式的,但是Invoke-Expression
是一个易于访问的cmdlet,几乎总是答案是永不使用它。但是cmdlet的存在是有原因的,并没有被弃用,并且大多数批评它的方式都类似于“几乎永远不是正确的答案”,但从未声明何时可以接受它。在什么情况下可以使用Invoke-Expression
?还是不那么公开地说,Invoke-Expression
是如何设计的?
答案 0 :(得分:6)
引用来自PowerShell团队博客文章Invoke-Expression considered harmful(强调):
最重要的是:Invoke-Expression在某些情况下是功能强大且有用的命令,例如在运行时创建新脚本,但是一般来说,如果您发现自己使用Invoke-Expression,则应询问自己,或者如果有更好的方法,也许是一个受人尊敬的同事。
EBGreen注释:
或者用另一种方式表达,只要用户不参与生成将被调用的字符串的任何部分,就可以使用[Invoke-Expression]。但是即使那样,与使用它相比,不使用它也会养成更好的习惯。
简而言之:
作为一种习惯,请始终首先考虑使用其他解决方案(通常更加健壮和安全)。
如果确实发现Invoke-Expression
是唯一的选择,请仔细考虑安全隐患:如果来自(不受信任的)外部源(例如,用户输入)的字符串直接传递给{{1 }},可以执行任意命令。
注意:从Windows PowerShell v5.1 / PowerShell Core v6.1.0开始,官方的Invoke-Expression
help topic并未提供此类指导; this GitHub issue建议予以纠正。
稀有合理(安全)使用Invoke-Expression
的示例: