在PowerShell中使用命名空间的范围是什么?



在PowerShell模块或脚本文件中指定using namespace时,是否有与要引入命名空间符号的指令关联的范围?

还是将命名空间符号引入全局会话状态,避免使用 PS 作用域修饰符?

using namespace System.Management.Automation.Runspaces

例如,如果我们在模块内部指定using namespace如果这仅适用于模块范围,那就太好了。

同样,如果我们在脚本文件中指定using namespace,如果这仅适用于该脚本,除非点源,那就太好了。

我没有测试任何这些,也无法找到有关此问题的文档。

using namespace语句遵循PowerShell通常的动态范围规则[1]

  • 它在放置它的作用域和所有后代作用域中生效。

    • 如果脚本文件(*.ps1)是点源的(例如. ./file.ps1),该语句在调用方的作用域中生效。
  • 由于模块具有自己的作用域("会话状态"),这些域仅连接到全局作用域,因此模块中的using namespace语句不会影响任何模块外部调用方。

    • 警告:从 PowerShell 7.1 开始,不能在导出函数的[OutputType([...])]属性中使用依赖于using namespace语句(例如,[Command]for[System.Management.Automation.Runspaces.Command])的仅名称类型文本(它们在参数声明和函数体中工作正常),如你发现的 GitHub 问题 GitHub 问题 #13768 中所述。

[1] 在撰写本文时,概念about_Scopes帮助主题并未明确讨论 PowerShell 作用域本身的动态性质(与 C# 等语言中的词汇作用域不同)。简单来说,PowerShell 的动态作用域意味着,在给定的作用域(非模块代码与给定模块的代码)内,从给定调用方调用的代码受该调用方的运行时状态(例如using语句、Set-StrictMode设置和调用方变量的可见性)的影响。

最新更新