提问人:metablaster 提问时间:1/10/2021 最后编辑:metablaster 更新时间:1/10/2021 访问量:1213
在 PowerShell 中使用命名空间的范围是什么?
What is the scope of using namespace in PowerShell?
问:
在 PowerShell 模块或脚本文件中指定时,是否有与将命名空间符号引入的指令关联的范围?using namespace
或者是否将命名空间符号引入全局会话状态,避免使用 PS 范围修饰符?
using namespace System.Management.Automation.Runspaces
例如,如果我们在模块内部指定,如果这仅适用于模块范围,那就太好了。using namespace
同样,如果我们在脚本文件中指定,如果这仅适用于该脚本,那就太好了,除非 dot sourced。using namespace
我没有测试任何这些,也无法找到有关此问题的文档。
答:
2赞
mklement0
1/10/2021
#1
语句遵循 PowerShell 通常的动态范围规则[1]:using namespace
它在放置它的作用域和所有后代作用域中生效。
- 如果脚本文件 () 是点源的(例如 ),则该语句在调用方的作用域中生效。
*.ps1
. ./file.ps1
- 如果脚本文件 () 是点源的(例如 ),则该语句在调用方的作用域中生效。
由于模块有自己的作用域(“会话状态”),这些域仅连接到全局作用域,因此模块中的语句不会影响任何模块外部调用方。
using namespace
- 注意:从 PowerShell 7.1 开始,不能使用依赖于导出函数的 [
OutputType([...
])] 属性中的语句(例如,for[System.Management.Automation.Runspaces.Command]
)的仅名称类型文本(它们在参数声明和函数体中工作正常),如你发现的 GitHub 问题 GitHub 问题 #13768 中所述。using namespace
[Command]
- 注意:从 PowerShell 7.1 开始,不能使用依赖于导出函数的 [
[1] 在撰写本文时,概念性about_Scopes帮助主题并未明确讨论 PowerShell 范围的动态性质(与 C# 等语言中的词法范围不同)。简单来说,PowerShell 的动态范围意味着,在给定范围域(非模块代码与给定模块的代码)内,从给定调用方调用的代码受该调用方的运行时状态的影响,例如通过使用
语句、Set-StrictMode
设置和调用方变量的可见性。
评论
using ...
语句已经是脚本范围的 - 它们适用于它们所定义的范围。测试一下,你会看到:)