【问题标题】:In what scenario was Invoke-Expression designed to be used?Invoke-Expression 设计用于什么场景?
【发布时间】:2018-12-17 13:06:19
【问题描述】:

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

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

【问题讨论】:

    标签: powershell


    【解决方案1】:

    引用标题为 Invoke-Expression considered harmful(强调)的 PowerShell 团队博客文章

    底线:Invoke-Expression 是一个强大且有用的命令,适用于某些场景,例如在运行时创建新脚本,但总的来说,如果您发现自己使用Invoke-Expression,如果有更好的方法,您应该问问自己或尊敬的同事

    EBGreen 备注:

    或者换一种说法,只要用户从不参与生成将被调用的字符串的任何部分,就可以使用 [Invoke-Expression]。但即便如此,不使用它也会比使用它养成更好的习惯。

    简而言之:

    • 按照习惯,请始终首先考虑不同的(通常更强大和更安全)解决方案

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

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

    注意:从 Windows PowerShell v5.1 / PowerShell Core v6.1.0 开始,官方Invoke-Expression help topic 不提供此类指导; this GitHub issue 建议纠正这个问题。


    很少有个合理(安全)使用Invoke-Expression的例子:

    【讨论】:

    • 谢谢,这回答了我的问题,除了在大多数情况下使用 Invoke-Expression 运行完全在 Powershell 中构建的脚本之外,我仍然可以考虑其他技术。所以我的结论是总是Invoke-Expression更好的解决方案。
    • @BendertheGreatest:很高兴听到这个消息。我不会总是说,但在大多数情况下;请看我的更新。
    • 我没有考虑这两种情况,但我不能说我经常(或曾经)动态创建 Powershell 类。如果用例证明了动态设计类的额外工作是合理的,那么可以看到它对 NoteProperties 集合的用处。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多