在Powershell中使用名称空间


9

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

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

这是真的,真的很乏味写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")

其中“我的” [System.Security.Cryptography.X509Certificates.StoreName]::My和“本地机器”的位置[System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine
如果将文字名称放在期望枚举成员的位置,则会自动将其转换为枚举成员。


就在这与您同在。
约瑟夫·科恩

Answers:


11

我知道,这有点晚了,但是PowerShell v5增加了很多很棒的语言。其中之一是“使用命名空间”。

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


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

6

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

你可以这样做:

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')

请注意,我为这些命令添加了类型名作为前缀,但是如果将它们传递给类型化参数,则只需将其省略。

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


很好,谢谢。我只是希望永远不要找到一个重载的方法,该方法可以将两个具有相同名称的成员的不同枚举作为参数:-)
Massimo 2009年

因为小费是有用的,所以接受了这一建议,但是问题仍然远远没有解决……:-/
Massimo,2009年

0

正确的方式?

$_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)

3
$ something = [type]仅适用于单个类型定义,不适用于整个名称空间。它适用于“数学”,因为那是一门课。
马西莫

...我非常需要进一步研究powershell ...
Joseph Kern 2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.