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

What is the scope of using namespace in PowerShell?

提问人:metablaster 提问时间:1/10/2021 最后编辑:metablaster 更新时间:1/10/2021 访问量:1213

问:

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

或者是否将命名空间符号引入全局会话状态,避免使用 PS 范围修饰符?

using namespace System.Management.Automation.Runspaces

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

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

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

PowerShell 使用指令

评论

1赞 Mathias R. Jessen 1/10/2021
using ...语句已经是脚本范围的 - 它们适用于它们所定义的范围。测试一下,你会看到:)
0赞 metablaster 1/10/2021
我确实测试了它,实际上它要么是模块范围,要么是脚本范围,只要脚本文件不是点源的。
1赞 metablaster 1/10/2021
我还发现了一个与这个问题相关的问题:github.com/PowerShell/PowerShell/issues/13768

答:

2赞 mklement0 1/10/2021 #1

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

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

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


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