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.


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.


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                                

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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.