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

「My」[System.Security.Cryptography.X509Certificates.StoreName]::Myと「LocalMachine」は[System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachineです。
リテラル名は、列挙型メンバーが必要な場所に配置されている場合、自動的に列挙型メンバーに変換されます。


これであなたと一緒に。
ジョセフ・カーン

回答:


11

少し遅れますが、PowerShell v5にはたくさんのすばらしい言語機能が追加されています。その1つは「名前空間の使用」です。

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はそれを適切に変換します(したがって、OpenFlags列挙値をとるパラメーターに 'ReadWrite'を渡すと問題なく動作します)。複数の値を渡したい場合は、次のようにできます。

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

これらのコマンドの先頭には型名を付けていますが、型付きパラメーターに渡す場合は省略してください。

これにより、すべての名前を装飾することなく、特定の名前空間で機能するスクリプトを作成できるようになります。


これは素晴らしいです、ありがとう。私は、同じ名前のメンバーを持つ2つの異なる列挙をパラメーターとして取ることができるオーバーロードされたメソッドを決して見つけないことを望みます:-)
Massimo

ヒントは便利ですが、問題はまだ解決されていないので、これを受け入れます...:-/
Massimo

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を勉強する必要があります...
ジョセフカーン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.