在 Powershell 中使用命名空间

Mas*_*imo 10 powershell .net namespaces

回答这个问题的时候想了想。

如何避免需要完全限定命名空间中的每个类型?

System.Security.Cryptography.X509Certificates.X509Store而不是X509Store,或[System.Security.Cryptography.X509Certificates.StoreName]::My代替 ,真的,真的很乏味[StoreName]::My

在 C# 中,您有using指令……Powershell 怎么样?


编辑 1 - 这适用于类型:

$ns = "System.Security.Cryptography.X509Certificates"
$store = New-Object "$ns.X509Store"(StoreName,StoreLocation)
Run Code Online (Sandbox Code Playgroud)

New-Object 将字符串文字作为类型定义,因此可以通过编程方式构建。


编辑 2 - 这适用于用作参数的枚举成员:

$store = New-Object "$ns.X509Store"("My","LocalMachine")
Run Code Online (Sandbox Code Playgroud)

“My”[System.Security.Cryptography.X509Certificates.StoreName]::My和“LocalMachine”在哪里[System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine
如果放置在需要枚举成员的位置,文字名称会自动转换为枚举成员。

小智 11

我知道,这有点晚了,但是 PowerShell v5 添加了大量很酷的语言内容。其中之一是“使用命名空间”。

PS> using namespace System.Security.Cryptography.X509Certificates; [X509Store]


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                
Run Code Online (Sandbox Code Playgroud)


小智 6

对于枚举,您不必指定整个类型名称。例如:

你可以这样做:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext([System.DirectoryServices.ActiveDirectory.DirectoryContextType]::Domain)
Run Code Online (Sandbox Code Playgroud)

或者更简单的版本:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Domain')
Run Code Online (Sandbox Code Playgroud)

您可以使用字符串来标识要使用的枚举,而不必使用完全修饰的名称。PowerShell 为您处理类型转换以将字符串转换为枚举值。使用上面显示的特定示例,这意味着您可以执行以下操作:

[System.Security.Cryptography.X509Certificates.OpenFlags]'ReadWrite'
Run Code Online (Sandbox Code Playgroud)

并且 Powershell 将正确转换它(因此将“ReadWrite”传递给采用 OpenFlags 枚举值的参数将工作得很好)。如果你想传递多个值,你可以这样做:

[System.Security.Cryptography.X509Certificates.OpenFlags]@('ReadWrite','IncludeArchived')
Run Code Online (Sandbox Code Playgroud)

请注意,我在这些命令前面加上了类型名称,但如果您将它们传递给类型化参数,则只需将其省略即可。

这将使您更接近能够编写使用特定名称空间的脚本,而无需修饰所有名称。