在 PowerShell 中使用命名空间的范围是什么?
What is the scope of using namespace in PowerShell?
在 PowerShell 模块或脚本文件中指定 using namespace
时,是否存在与引入命名空间符号的指令关联的范围?
或者是否将名称空间符号引入全局会话状态以避免 PS 范围修饰符?
using namespace System.Management.Automation.Runspaces
例如,如果我们在模块内指定 using namespace
,如果这仅适用于模块范围,那就太好了。
同样,如果我们在脚本文件中指定 using namespace
,那么如果这仅适用于该脚本,那就太好了,除非点源。
我没有测试任何这个,也找不到关于这个问题的文档。
using namespace
语句遵循 PowerShell 通常的动态作用域规则[1]:
在其放置的作用域及所有后代作用域.
生效
- 如果脚本文件(
*.ps1
)是dot-sourced(例如. ./file.ps1
),该语句在调用者的范围内生效。
由于模块有自己的范围域(“会话状态”),它们只连接到 global 范围,using namespace
中的语句模块不影响任何模块外部调用者。
- 警告:从 PowerShell 7.1 开始,您不能使用依赖于
using namespace
语句的仅名称类型文字(例如,[Command]
for [System.Management.Automation.Runspaces.Command]
) in [OutputType([...])]
attributes of exported functions (they work fine in parameter declarations and function bodies), as detailed in the GitHub issue you've discovered, GitHub issue #13768.
[1] 在撰写本文时,概念性 about_Scopes 帮助主题并未 明确地 讨论 动态 PowerShell 作用域的性质(与您在 C# 等语言中发现的 词法 作用域不同)。简单来说,PowerShell 的动态作用域意味着,在给定范围域内(非模块代码与给定模块代码),从给定调用者调用的代码受 runtime 状态影响该调用者的信息,例如 using
语句、Set-StrictMode
设置以及调用者变量的可见性。
在 PowerShell 模块或脚本文件中指定 using namespace
时,是否存在与引入命名空间符号的指令关联的范围?
或者是否将名称空间符号引入全局会话状态以避免 PS 范围修饰符?
using namespace System.Management.Automation.Runspaces
例如,如果我们在模块内指定 using namespace
,如果这仅适用于模块范围,那就太好了。
同样,如果我们在脚本文件中指定 using namespace
,那么如果这仅适用于该脚本,那就太好了,除非点源。
我没有测试任何这个,也找不到关于这个问题的文档。
using namespace
语句遵循 PowerShell 通常的动态作用域规则[1]:
在其放置的作用域及所有后代作用域.
生效- 如果脚本文件(
*.ps1
)是dot-sourced(例如. ./file.ps1
),该语句在调用者的范围内生效。
- 如果脚本文件(
由于模块有自己的范围域(“会话状态”),它们只连接到 global 范围,
using namespace
中的语句模块不影响任何模块外部调用者。- 警告:从 PowerShell 7.1 开始,您不能使用依赖于
using namespace
语句的仅名称类型文字(例如,[Command]
for[System.Management.Automation.Runspaces.Command]
) in[OutputType([...])]
attributes of exported functions (they work fine in parameter declarations and function bodies), as detailed in the GitHub issue you've discovered, GitHub issue #13768.
- 警告:从 PowerShell 7.1 开始,您不能使用依赖于
[1] 在撰写本文时,概念性 about_Scopes 帮助主题并未 明确地 讨论 动态 PowerShell 作用域的性质(与您在 C# 等语言中发现的 词法 作用域不同)。简单来说,PowerShell 的动态作用域意味着,在给定范围域内(非模块代码与给定模块代码),从给定调用者调用的代码受 runtime 状态影响该调用者的信息,例如 using
语句、Set-StrictMode
设置以及调用者变量的可见性。