Menggunakan ruang nama di Powershell

9

Pikirkan hal itu saat menjawab pertanyaan ini .

Bagaimana Anda bisa menghindari kebutuhan untuk sepenuhnya memenuhi syarat setiap jenis tunggal dalam namespace?

Sangat membosankan untuk menulis System.Security.Cryptography.X509Certificates.X509Storealih-alih X509Store, atau [System.Security.Cryptography.X509Certificates.StoreName]::Myalih-alih [StoreName]::My.

Dalam C # Anda memiliki usingarahan ... bagaimana dengan Powershell?


EDIT 1 - Ini berfungsi untuk jenis:

$ns = "System.Security.Cryptography.X509Certificates"
$store = New-Object "$ns.X509Store"(StoreName,StoreLocation)

New-Object mengambil string literal sebagai definisi tipe, sehingga dapat dibangun secara terprogram.


EDIT 2 - Ini berfungsi untuk anggota penghitungan yang digunakan sebagai parameter:

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

Di mana "My" berada [System.Security.Cryptography.X509Certificates.StoreName]::Mydan "LocalMachine" adalah [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine.
Nama literal secara otomatis dikonversi ke anggota pencacahan, jika ditempatkan di mana seorang anggota pencacahan diharapkan.

Massimo
sumber
Di sana dengan Anda yang satu ini.
Joseph Kern

Jawaban:

11

Saya tahu, ini sedikit terlambat, tetapi PowerShell v5 menambahkan banyak hal bahasa keren. Salah satunya adalah 'menggunakan namespace'.

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


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                
xvorsx
sumber
6

Untuk penghitungan, Anda tidak perlu menentukan nama tipe keseluruhan. Sebagai contoh:

Kamu bisa melakukan ini:

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

atau versi yang jauh lebih sederhana:

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

Anda dapat menggunakan string untuk mengidentifikasi enumerasi yang ingin Anda gunakan tanpa harus menggunakan nama yang sepenuhnya didekorasi. PowerShell menangani pengetikan bagi Anda untuk mengonversi string ke nilai enumerasi. Menggunakan contoh spesifik yang Anda tunjukkan di atas, itu artinya Anda bisa melakukan ini:

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

Dan Powershell akan mengubahnya dengan benar (jadi meneruskan 'ReadWrite' ke parameter yang mengambil nilai enumerasi OpenFlags akan berfungsi dengan baik). Jika Anda ingin memberikan beberapa nilai, Anda dapat melakukannya seperti ini:

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

Perhatikan bahwa saya mengawali perintah-perintah ini dengan nama ketik, tetapi jika Anda meneruskannya ke parameter yang diketik Anda hanya akan meninggalkan itu.

Itu seharusnya membuat Anda selangkah lebih dekat untuk bisa menulis skrip yang bekerja dengan namespace tertentu tanpa harus mendekorasi semua nama.

Poshoholic
sumber
Ini bekerja dengan baik, terima kasih. Saya hanya berharap untuk tidak pernah menemukan metode kelebihan beban yang dapat mengambil sebagai parameter dua enumerasi berbeda yang memiliki anggota dengan nama yang sama :-)
Massimo
Menerima yang satu ini karena tipnya berguna, tetapi masalah ini masih cukup jauh dari diselesaikan ...: - /
Massimo
0

Jalan yang benar?

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

Dan ini sepertinya berhasil:

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

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

Tapi itu jelek ketika Anda melakukan ini:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)
Joseph Kern
sumber
3
$ something = [type] hanya berfungsi untuk definisi tipe tunggal, bukan untuk keseluruhan namespace. Ini berfungsi untuk "Matematika" karena itu kelas.
Massimo
... Saya benar-benar perlu belajar PowerShell lebih ...
Joseph Kern