当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 避免使用调用表达式

作者:精品下载站 日期:2024-12-14 03:03:40 浏览:14 分类:玩电脑

避免使用调用表达式


Invoke-Expression cmdlet 只能用作最后的手段。在大多数情况下,都可以使用更安全、更强大的替代方案。像 Stack Overflow 这样的论坛充满了 Invoke-Expression 滥用的例子。另请注意,PSScriptAnalyzer对此有一个规则。有关详细信息,请参阅避免使用InvokeExpression。

仔细考虑安全影响。当来自不受信任源(例如用户输入)的字符串直接传递到 Invoke-Expression 时,可以执行任意命令。始终首先考虑不同的、更强大、更安全的解决方案。

常见场景

考虑以下使用场景:

  • 重定向 PowerShell 以自然地执行某些操作会更简单。例如:

    Get-Content ./file.ps1 | Invoke-Expression
    

    这些情况是完全可以避免的。脚本或代码已经以文件或 AST 形式存在,因此您应该编写带有参数的脚本并直接调用它,而不是在字符串上使用 Invoke-Expression

  • 从受信任的来源运行脚本。例如,从 PowerShell 存储库运行安装脚本:

    Invoke-WebRequest https://aka.ms/install-powershell.ps1 | Invoke-Expression
    

    您应该仅以交互方式使用它。而且,虽然这确实让生活变得更简单,但这种做法应该被劝阻。

  • 测试解析错误。PowerShell 团队使用 Invoke-Expression 测试源代码中的解析错误,因为这是将解析时错误转变为运行时错误的唯一方法。

结论

大多数其他脚本语言都有一种将字符串计算为代码的方法,而作为解释性语言,PowerShell 必须有一种动态运行自身的方法。但没有充分的理由在生产环境中使用 Invoke-Expression

参考

  • Stack Overflow 讨论 - Invoke-Expression 设计用于什么场景?
  • PowerShell 博客文章 - Invoke-Expression 被认为是有害的

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯