代码之家  ›  专栏  ›  技术社区  ›  codewario

“invoke expression”设计用于什么场景?

  •  2
  • codewario  · 技术社区  · 6 年前

    如果你试图使用 Invoke-Expression 中校,有更好的办法。动态构建命令的参数?使用参数数组。为Cmdlet生成参数?对数组或哈希表使用splatting。你的命令在路径上有空格吗?使用呼叫接线员( & )中。

    这似乎是无限期的,但是 调用表达式 是一个易于访问的cmdlet,其答案几乎总是不使用它。但是CMDLE是有原因的,不是被贬低的,它的大多数批评使用类似的东西,“它几乎从来都不是正确的答案”,但在使用它时,它从来都不是状态。在什么情况下可以使用 调用表达式 是吗?或者不那么公开地说 调用表达式 设计使用?

    1 回复  |  直到 6 年前
        1
  •  7
  •   mklement0    5 年前

    引用 powershell团队博客文章 有头衔的 Invoke-Expression considered harmful (重点补充):

    底线是:invoke表达式是一个强大的 对于某些场景(例如在运行时创建新脚本)有用的命令 ,但总的来说, 如果你发现自己在使用 Invoke-Expression ,你应该扪心自问,或者问一位受人尊敬的同事是否有更好的方法 是的。

    EBGreen 笔记:

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

    简而言之:

    • 作为一种习惯,总是先考虑一个不同的(通常更健壮和安全的)解决方案 是的。

    • 如果你真的发现了 调用表达式 是你唯一的选择,仔细考虑一下安全问题 :如果来自(不受信任的)外部源(例如,用户输入)的字符串直接传递给 调用表达式 ,可以执行任意命令。

    注意:从Windows Powershell v5.1/Powershell Core v6.1.0开始,官方 Invoke-Expression help topic 不提供这样的指导; this GitHub issue 建议纠正这一点。


    罕见的 合理(安全)使用 调用表达式 以下内容: