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# 所以无法自己回答这个问题。
有点混乱的顺序:
这是胡说八道;无论如何,该术语
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)