Usar espacios de nombres en Powershell

9

Pensé en ello mientras respondía esta pregunta .

¿Cómo puede evitar la necesidad de calificar completamente cada tipo en un espacio de nombres?

Es realmente, muy tedioso escribir en System.Security.Cryptography.X509Certificates.X509Storelugar de X509Store, o en [System.Security.Cryptography.X509Certificates.StoreName]::Mylugar de [StoreName]::My.

En C # tienes usingdirectivas ... ¿qué pasa con Powershell?


EDITAR 1 : esto funciona para los tipos:

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

New-Object toma un literal de cadena como la definición de tipo, por lo que puede construirse mediante programación.


EDITAR 2 : esto funciona para los miembros de enumeración utilizados como parámetros:

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

Donde está "My" [System.Security.Cryptography.X509Certificates.StoreName]::Myy "LocalMachine" [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine.
Los nombres literales se convierten automáticamente en miembros de enumeración, si se colocan donde se espera un miembro de enumeración.

Massimo
fuente
Justo contigo en este caso.
Joseph Kern el

Respuestas:

11

Lo sé, es un poco tarde, pero PowerShell v5 agrega toneladas de lenguaje genial. Uno de ellos es 'usar el espacio de nombres'.

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


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

Para las enumeraciones no tiene que especificar el nombre completo del tipo. Por ejemplo:

Puedes hacerlo:

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

o la versión mucho más simple:

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

Puede usar cadenas para identificar las enumeraciones que desea usar sin tener que usar el nombre completamente decorado. PowerShell maneja la conversión de texto para que pueda convertir las cadenas a los valores de enumeración. Usando el ejemplo específico que mostró arriba, eso significa que puede hacer esto:

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

Y Powershell lo convertirá correctamente (por lo que pasar 'ReadWrite' a un parámetro que tome un valor de enumeración de OpenFlags funcionará bien). Si desea pasar varios valores, puede hacerlo así:

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

Tenga en cuenta que estoy prefijando estos comandos con el nombre del tipo, pero si los pasara a un parámetro escrito, simplemente lo omitiría.

Eso debería estar un paso más cerca de poder escribir scripts que funcionen con un espacio de nombres específico sin tener que decorar todos los nombres.

Poshoholic
fuente
Esto funciona muy bien, gracias. Solo espero nunca encontrar un método sobrecargado que pueda tomar como parámetro dos enumeraciones diferentes que tengan un miembro con el mismo nombre :-)
Massimo
Aceptar este porque la sugerencia es útil, pero el problema aún está lejos de resolverse ...: - /
Massimo
0

¿La direccion correcta?

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

Y esto 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)

Pero es feo cuando haces esto:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)
Joseph Kern
fuente
3
$ something = [type] solo funciona para una definición de tipo único, no para un espacio de nombres completo. Funciona para "Matemáticas" porque es una clase.
Massimo
... realmente necesito estudiar PowerShell más ...
Joseph Kern el