Usando namespaces no Powershell

9

Pensei nisso enquanto respondia a essa pergunta .

Como você pode evitar a necessidade de qualificar totalmente todos os tipos em um espaço para nome?

É muito, muito entediante escrever em System.Security.Cryptography.X509Certificates.X509Storevez de X509Store, ou em [System.Security.Cryptography.X509Certificates.StoreName]::Myvez de [StoreName]::My.

Em C # você tem usingdiretrizes ... e o Powershell?


EDIT 1 - Isso 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, para que possa ser criada programaticamente.


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

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

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

Massimo
fonte
Bem ali com você neste.
31411 Joseph Kern

Respostas:

11

Eu sei, é um pouco tarde, mas o PowerShell v5 adiciona toneladas de coisas interessantes em linguagem. Um deles é 'usando espaço para nome'.

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


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

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

Você consegue 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 seqüências de caracteres para identificar as enumerações que deseja usar sem precisar usar o nome totalmente decorado. O PowerShell lida com a conversão de tipo para converter as seqüências 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 o converterá adequadamente (assim, passar 'ReadWrite' para um parâmetro que aceita um valor de enumeração OpenFlags funcionará perfeitamente). Se você deseja passar vários valores, é possível fazer o seguinte:

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

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

Isso deve levá-lo um passo mais perto de poder escrever scripts que funcionem com um espaço para nome específico sem precisar decorar todos os nomes.

Poshoholic
fonte
Isso funciona muito bem, obrigado. Eu só espero nunca encontrar um método sobrecarregado que pode tomar como parâmetro duas enumerações diferentes que têm um membro com o mesmo nome :-)
Massimo
Aceitando este porque a dica é útil, mas o problema ainda está longe de ser resolvido ...: - /
Massimo
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)
Joseph Kern
fonte
3
$ something = [type] funciona apenas para uma única definição de tipo, não para um espaço para nome inteiro. Funciona para "Matemática" porque é uma classe.
Massimo
... Eu seriamente preciso estudo powershell mais ...
Joseph Kern