回答的时候思考了一下这个问题。
如何避免完全限定命名空间中的每个类型?
写起来真的非常乏味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)