Usando namespaces no Powershell

8

Pense nisso ao responder esta pergunta .

Como você pode evitar a necessidade de qualificar totalmente todos os tipos em um namespace?

É muito tedioso escrever System.Security.Cryptography.X509Certificates.X509Store em vez de X509Store ou [System.Security.Cryptography.X509Certificates.StoreName]::My em vez de [StoreName]::My .

Em C # você tem diretivas using ... e Powershell?

EDIT 1 - funciona para tipos:

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

New-Object aceita uma string literal como a definição de tipo, portanto ela pode ser construída de forma programática.

EDIT 2 - Funciona para membros de enumeração usados como parâmetros:

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

Onde "My" é [System.Security.Cryptography.X509Certificates.StoreName]::My e "LocalMachine" é [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine .
Nomes literais são automaticamente convertidos em membros de enumeração, se colocados onde um membro de enumeração é esperado.

    
por Massimo 15.10.2009 / 14:33

3 respostas

6

Para enumerações, você não precisa especificar o nome do tipo inteiro. Por exemplo:

Você pode fazer isso:

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

ou a versão muito mais simples:

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

Você pode usar strings para identificar as enumerações que deseja usar sem precisar usar o nome totalmente decorado. O PowerShell manipula o typecasting para converter as cadeias de caracteres em valores de enumeração. Usando o exemplo específico que você mostrou acima, isso significa que você pode fazer isso:

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

E o Powershell irá convertê-lo corretamente (então, passar 'ReadWrite' para um parâmetro que recebe um valor de enumeração OpenFlags funcionará muito bem). Se você quer passar vários valores, você pode fazer assim:

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

Note que estou prefixando esses comandos com o nome do tipo, mas se você estivesse passando-os para um parâmetro digitado, você simplesmente deixaria isso de lado.

Isso deve aproximá-lo um passo da possibilidade de escrever scripts que funcionem com um namespace específico sem precisar decorar todos os nomes.

    
por 15.10.2009 / 21:15
10

Eu sei, é um pouco tarde, mas o PowerShell v5 adiciona toneladas de coisas legais em termos de linguagem. Uma delas é "usando namespace".

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


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                
    
por 12.09.2015 / 04:16
0

O caminho certo?

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

E isso parece funcionar:

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

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

Mas é feio quando você faz isso:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)
    
por 15.10.2009 / 14:41