在 Powershell 中使用命名空间

在 Powershell 中使用命名空间

回答的时候思考了一下这个问题

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

写起来真的非常乏味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)

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


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

$store = New-Object "$ns.X509Store"("My","LocalMachine")

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

答案1

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

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


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                

答案2

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

你可以这样做:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext([System.DirectoryServices.ActiveDirectory.DirectoryContextType]::Domain)

或者更简单的版本:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Domain')

您可以使用字符串来标识要使用的枚举,而无需使用完整修饰的名称。 PowerShell 会为您处理类型转换,以将字符串转换为枚举值。 使用上面显示的具体示例,这意味着您可以这样做:

[System.Security.Cryptography.X509Certificates.OpenFlags]'ReadWrite'

Powershell 会正确地转换它(因此将“ReadWrite”传递给采用 OpenFlags 枚举值的参数就可以了)。如果您想传递多个值,可以这样做:

[System.Security.Cryptography.X509Certificates.OpenFlags]@('ReadWrite','IncludeArchived')

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

这应该使您更接近能够编写适用于特定命名空间的脚本,而不必修饰所有名称。

答案3

正确的方式?

$_m = [math]
$_m::sin((45*($_m::pi/180))) 

这似乎有效:

[Reflection.Assembly]::Load("System.Security, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates.X509Store'
New-Object $stoopidnamespace($null)

但是当你这样做的时候,它就很难看了:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)

相关内容