Verwenden von Namespaces in Powershell

8

Ich habe darüber nachgedacht, als ich diese Frage beantwortet habe .

Wie können Sie vermeiden, dass jeder einzelne Typ in einem Namespace vollständig qualifiziert werden muss?

Es ist wirklich sehr, sehr langweilig, System.Security.Cryptography.X509Certificates.X509Storestatt X509Storeoder [System.Security.Cryptography.X509Certificates.StoreName]::Mystatt zu schreiben [StoreName]::My.

In C # haben Sie usingAnweisungen ... was ist mit Powershell?


EDIT 1 - Dies funktioniert für Typen:

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

New-Object verwendet ein String-Literal als Typdefinition, sodass es programmgesteuert erstellt werden kann.


EDIT 2 - Dies funktioniert für Aufzählungselemente, die als Parameter verwendet werden:

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

Wo "Mein" ist [System.Security.Cryptography.X509Certificates.StoreName]::Myund "LocalMachine" ist [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine.
Literalnamen werden automatisch in Aufzählungselemente konvertiert, wenn sie dort platziert werden, wo ein Aufzählungsmitglied erwartet wird.

Massimo
quelle
Genau dort mit dir in diesem Fall.
Joseph Kern

Antworten:

7

Für Aufzählungen müssen Sie nicht den gesamten Typnamen angeben. Zum Beispiel:

Du kannst das:

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

oder die viel einfachere Version:

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

Sie können Zeichenfolgen verwenden, um die Aufzählungen zu identifizieren, die Sie verwenden möchten, ohne den vollständig dekorierten Namen verwenden zu müssen. PowerShell übernimmt die Typumwandlung, damit Sie die Zeichenfolgen in die Aufzählungswerte konvertieren können. Anhand des oben gezeigten Beispiels können Sie Folgendes tun:

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

Und Powershell konvertiert es ordnungsgemäß (die Übergabe von 'ReadWrite' an einen Parameter, der einen OpenFlags-Aufzählungswert annimmt, funktioniert also einwandfrei). Wenn Sie mehrere Werte übergeben möchten, können Sie dies folgendermaßen tun:

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

Beachten Sie, dass ich diesen Befehlen den Typnamen voranstelle, aber wenn Sie sie an einen typisierten Parameter übergeben würden, würden Sie dies einfach weglassen.

Damit sollten Sie der Möglichkeit, Skripte zu schreiben, die mit einem bestimmten Namespace arbeiten, einen Schritt näher kommen, ohne alle Namen dekorieren zu müssen.

Poshoholic
quelle
Das funktioniert super, danke. Ich hoffe nur, nie eine überladene Methode zu finden, die zwei verschiedene Aufzählungen als Parameter verwenden kann, die ein Mitglied mit demselben Namen haben :-)
Massimo
Akzeptiere diesen, weil der Tipp nützlich ist, aber das Problem ist noch lange nicht gelöst ...: - /
Massimo
10

Ich weiß, es ist ein bisschen spät, aber PowerShell v5 fügt jede Menge cooler Sprachmaterialien hinzu. Eines davon ist "Namespace verwenden".

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


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                
xvorsx
quelle
0

Der richtige Weg?

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

Und das scheint zu funktionieren:

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

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

Aber es ist hässlich, wenn Sie dies tun:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)
Joseph Kern
quelle
3
$ Something = [Typ] funktioniert nur für eine einzelne Typdefinition, nicht für einen ganzen Namespace. Es funktioniert für "Math", weil das eine Klasse ist.
Massimo
... Ich muss ernsthaft mehr PowerShell studieren ...
Joseph Kern