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)
请注意,我在这些命令前面加上了类型名称,但如果您将它们传递给类型化参数,则只需将其省略即可。
这将使您更接近能够编写使用特定名称空间的脚本,而无需修饰所有名称。
归档时间: |
|
查看次数: |
12514 次 |
最近记录: |