在powershell中键入完全限定的类型名称?

met*_*ter 4 powershell namespaces

例如,我想减少打字System和其他根命名空间

[string] $ComputerName = [Environment]::MachineName
Run Code Online (Sandbox Code Playgroud)

对比

[System.String] $ComputerName = [System.Environment]::MachineName
Run Code Online (Sandbox Code Playgroud)

另一个例子:

[Net.Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)

对比

[System.Net.Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)

键入System和需要类似的父命名空间时是否有任何原因和特定情况?

我经常想知道为什么System毕竟有命名空间,因为一切都在该命名空间内,那么与该命名空间有什么关系呢?这是胡说八道;无论如何,该术语System应该是什么意思?这里与操作系统无关。但是对于 NET 框架中的所有内容。

我假设调用静态方法时可能会出现异常,但我不知道 C# 所以无法自己回答这个问题。

Mat*_*sen 6

有点混乱的顺序:

这是胡说八道;无论如何,该术语System应该是什么意思?

有问题的“系统”是 .NET 运行时和框架。据我所知,最初的想法是,不.NET一起提供的代码将属于不同的命名空间——但是构建在 .NET 之上的多个 Microsoft 创作的组件已经使用了System父命名空间——包括所有构成 PowerShell 本身的 API。

我经常想知道为什么System毕竟有 [a]命名空间,因为一切都在该命名空间内,那么该命名空间有什么处理呢?

并非“所有内容”都在System命名空间内,但如上所述,运行时或基类库附带的所有内容都是 - 这正是 PowerShell 自动解析类型文字的原因,即使您省略System.了限定类型名称 - PowerShell正试图提供帮助你已经减少打字了

键入 System 和类似的父命名空间时是否有任何原因和特定情况?

是 - 当父命名空间不是 System.

想到的第一个例子是 Windows 上 Win32 注册表 API 的 .NET 包装类:

$HKLM = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, [Microsoft.Win32.RegistryView]::Default)
Run Code Online (Sandbox Code Playgroud)

现在,对于实际问题:

我想减少打字System和其他根命名空间

您不能添加自定义命名空间前缀(如System)到PowerShell的名称解析方法,但你可以声明在类型名称的自动解析特定的名称空间在PowerShell中5只及以上,与using namespace指令

没有using namespace

[System.Net.Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)

using namespace

using namespace System.Net

[Dns]::GetHostEntry("192.168.1.1")
Run Code Online (Sandbox Code Playgroud)

在脚本中使用时,任何using指令都必须位于文件中的任何其他内容之前,包括param块。

using namespace 指令也可以在交互式会话中工作,前提是您将其作为单独的语句发出:

PS> using namespace System.Net 
PS> [Dns] # still works!
Run Code Online (Sandbox Code Playgroud)