Utilizzo di spazi dei nomi in Powershell


9

Ci ho pensato mentre rispondevo a questa domanda .

Come evitare la necessità di qualificare completamente ogni singolo tipo in uno spazio dei nomi?

Scrivere è davvero molto noioso al System.Security.Cryptography.X509Certificates.X509Storeposto di X509Storeo al [System.Security.Cryptography.X509Certificates.StoreName]::Myposto di [StoreName]::My.

In C # hai delle usingdirettive ... che dire di Powershell?


EDIT 1 - Funziona con i tipi:

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

New-Object accetta una stringa letterale come definizione del tipo, quindi può essere costruita a livello di codice.


EDIT 2 - Funziona con i membri dell'enumerazione usati come parametri:

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

Dove "My" è [System.Security.Cryptography.X509Certificates.StoreName]::Mye "LocalMachine" è [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine.
I nomi letterali vengono automaticamente convertiti in membri di enumerazione, se inseriti dove è previsto un membro di enumerazione.


Proprio lì con te su questo.
Joseph Kern,

Risposte:


11

Lo so, è un po 'tardi, ma PowerShell v5 aggiunge un sacco di cose interessanti sul linguaggio. Uno di questi è "usare lo spazio dei nomi".

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


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

6

Per le enumerazioni non è necessario specificare l'intero nome del tipo. Per esempio:

Puoi farlo:

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

o la versione molto più semplice:

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

È possibile utilizzare le stringhe per identificare le enumerazioni che si desidera utilizzare senza dover utilizzare il nome completamente decorato. PowerShell gestisce la tipografia per convertire le stringhe nei valori di enumerazione. Utilizzando l'esempio specifico che hai mostrato sopra, ciò significa che puoi farlo:

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

E Powershell lo convertirà correttamente (quindi passare 'ReadWrite' a un parametro che accetta un valore di enumerazione OpenFlags funzionerà bene). Se vuoi passare più valori, puoi farlo in questo modo:

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

Nota che sto anteponendo a questi comandi il nome del tipo, ma se li passassi a un parametro digitato lo lasceresti semplicemente fuori.

Ciò dovrebbe farti avvicinare di più alla possibilità di scrivere script che funzionano con uno spazio dei nomi specifico senza dover decorare tutti i nomi.


Funziona benissimo, grazie. Spero solo di non trovare mai un metodo sovraccarico che possa prendere come parametro due diverse enumerazioni che hanno un membro con lo stesso nome :-)
Massimo,

Accettare questo perché il suggerimento è utile, ma il problema è ancora piuttosto lontano dalla risoluzione ...: - /
Massimo

0

Il modo giusto?

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

E questo sembra funzionare:

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

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

Ma è brutto quando lo fai:

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

3
$ qualcosa = [tipo] funziona solo per una definizione di tipo singolo, non per un intero spazio dei nomi. Funziona con "Math" perché è una lezione.
Massimo,

... Ho davvero bisogno di studiare di più PowerShell ...
Joseph Kern,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.