74 votos

¿Equivalente a la palabra clave "using" de C# en powershell?

Cuando utilizo otro objeto en el .net-Framework en C# puedo ahorrarme mucho tecleo utilizando la directiva using.

using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It;

...

  var blurb = new Thingamabob();

...

¿Existe una forma de hacer algo similar en Powershell? Estoy accediendo a un montón de objetos .net y no estoy contento de tener que escribir

 $blurb = new-object FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob;

todo el tiempo.

56voto

dahlbyk Puntos 24897

Realmente no hay nada a nivel de espacio de nombres así. A menudo asigno los tipos de uso común a las variables y luego las instancias:

$thingtype = [FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob];
$blurb = New-Object $thingtype.FullName

Probablemente no valga la pena si el tipo no se va a utilizar repetidamente, pero creo que es lo mejor que se puede hacer.

46voto

Brant Bobby Puntos 4540

PowerShell 5.0 (incluido en WMF5 o en Windows 10 y superior), añade el using namespace construcción a la lengua. Puedes usarlo en tu script de esta manera:

#Require -Version 5.0
using namespace FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It
$blurb = [Thingamabob]::new()

(El #Require en la primera línea no es necesaria para utilizar using namespace pero impedirá que el script se ejecute en PS 4.0 y en versiones inferiores en las que using namespace es un error de sintaxis).

12voto

Richard Berg Puntos 14218

Consulta esta entrada del blog de hace un par de años: http://blogs.msdn.com/richardb/archive/2007/02/21/add-types-ps1-poor-man-s-using-for-powershell.aspx

Aquí está add-types.ps1 extraído de ese artículo:

param(
    [string] $assemblyName = $(throw 'assemblyName is required'),
    [object] $object
)

process {
    if ($_) {
        $object = $_
    }

    if (! $object) {
        throw 'must pass an -object parameter or pipe one in'
    }

    # load the required dll
    $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assemblyName)

    # add each type as a member property
    $assembly.GetTypes() | 
    where {$_.ispublic -and !$_.IsSubclassOf( [Exception] ) -and $_.name -notmatch "event"} | 
    foreach { 
        # avoid error messages in case it already exists
        if (! ($object | get-member $_.name)) {
            add-member noteproperty $_.name $_ -inputobject $object
        }
    }
}

Y, para usarlo:

RICBERG470> $tfs | add-types "Microsoft.TeamFoundation.VersionControl.Client"
RICBERG470> $itemSpec = new-object $tfs.itemspec("$/foo", $tfs.RecursionType::none)

Básicamente lo que hago es rastrear el ensamblaje en busca de tipos no triviales, y luego escribir un "constructor" que utilice Add-Member para añadirlos (de forma estructurada) a los objetos que me interesan.

Véase también este post de seguimiento: http://richardberg.net/blog/?p=38

7voto

Esto es solo una broma, broma...

$fullnames = New-Object ( [System.Collections.Generic.List``1].MakeGenericType( [String]) );

function using ( $name ) { 
foreach ( $type in [Reflection.Assembly]::LoadWithPartialName($name).GetTypes() )
    {
        $fullnames.Add($type.fullname);
    }
}

function new ( $name ) {
    $fullname = $fullnames -like "*.$name";
    return , (New-Object $fullname[0]);
}

using System.Windows.Forms
using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It
$a = new button
$b = new Thingamabob

5voto

bouvierr Puntos 1046

Si sólo necesita crear una instancia de su tipo, puede almacenar el nombre del espacio de nombres largo en una cadena:

$st = "System.Text"
$sb = New-Object "$st.StringBuilder"

No es tan potente como el using en C#, pero al menos es muy fácil de usar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X