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

标签 powershell using-directives

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

或者将命名空间符号引入全局 session 状态以避免 PS 作用域修饰符?

using namespace System.Management.Automation.Runspaces

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

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

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

最佳答案

using namespace 语句遵循 PowerShell 通常的动态作用域规则[1]:

  • 它在它所在的范围和所有后代范围中生效。

    • 如果脚本文件 (*.ps1) 是 dot-sourced (例如 . ./file.ps1),该语句在调用者范围内生效。
  • 由于模块有自己的作用域(“ session 状态”),仅连接到全局作用域,因此模块中的 using namespace 语句不会不会影响任何模块外部调用者。

    • 警告:从 PowerShell 7.1 开始,您不能使用依赖于 using namespace 语句的纯名称类型文字(例如 [Command] for [System.Management.Automation.Runspaces.Command] ) 在导出函数的 [OutputType([...])] 属性中(它们在参数声明和函数体中工作良好),详细信息请参见您发现的 GitHub 问题,GitHub issue #13768 .

[1] 截至撰写本文时,概念 about_Scopes帮助主题没有明确讨论 PowerShell 作用域的动态本质(与您在诸如以下语言中发现的词法作用域不同) C#)。简单来说,PowerShell 的动态作用域意味着,在给定的作用域范围内(非模块代码与给定模块的代码),从给定调用者调用的代码受到该调用者的运行时状态的影响,例如通过 using 语句、Set-StrictMode 设置以及调用者变量的可见性。

关于powershell - PowerShell 中使用命名空间的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65645394/

相关文章:

c++ - 为什么 ADL 优先于 'std namespace' 中的函数,但等于用户定义的命名空间中的函数?

c# - 必须使用完全限定的类名

c++ - 未命名命名空间中 `using namespace` 的范围

c++ - 结构/类声明中的作用域使用指令?

powershell - 请求帮助来解析字符串

powershell - 检查字典是否区分大小写

powershell - 如何从模块中检索可用命令?

powershell - 启动新进程时如何在PowerShell中更改UI标题

powershell - 在Powershell中的ForEach-Object中引用目标对象

c# - 组织 using 指令,重新运行测试?