2010-03-27 12 views
6

io uso questo codice per caricare un assemblaggio .Net di PowerShell:PowerShell - Set Alias ​​per l'Assemblea Loaded

[System.Reflection.Assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") | out-null 
[System.Windows.Forms.MessageBox]::Show("Hello world") 

posso impostare un alias per un gruppo (ad esempio: 'System.Windows.Forms '=' Moduli ') in modo che non sia necessario digitare il nome completo dell'assembly quando si chiama un metodo statico come MessageBox.Show()?

risposta

5

Mentre non si può creare una sorta di alias dello spazio dei nomi di per sé, è possibile utilizzare il seguente trucco (tratto da Lee Holmes' PowerShell Cookbook):

$namespace = "System.Windows.Forms.{0}" 
$form = New-Object ($namespace -f "Form") 

Ma che solo lavorerà con New-Object da quel prende una stringa per il nome della classe. Non è possibile utilizzare quella sintassi con un nome di tipo tra parentesi quadre.

Che cosa si può fare, tuttavia, è lasciare fuori la parte System che è implicita:

[Windows.Forms.MessageBox]::Show("Hello World!") 

rende leggermente più corto.

+0

Vi ringrazio entrambi per aver risposto –

+0

non sapevo su System di essere implicita. Grazie! – Kleinux

+0

@Kleinux: Funziona per riferirsi ai tipi, ed è per questo che puoi scrivere '[datetime]' invece di '[system.datetime]' ma non funzionerà per caricare un assembly (cioè, Add-Type - Assembly Windows.Forms' non funzionerà). – Joey

10

È possibile memorizzare il tipo di variabile e utilizzare la variabile

$forms = [System.Windows.Forms.MessageBox] 
$forms::Show('Hello') 

E in questo caso è possibile caricare l'assembly in questo modo:

Add-Type –assembly system.windows.forms 
1

Utilizzando Joey 's risposta è possibile utilizzare questo funzione per impostare "alias" per gli assiemi. Assegna fondamentalmente un assembly a una funzione con il nome dell'alias specificato che si desidera.

function Global:Add_Assembly_Alias($STR_assembly, $alias) { 

    [string]$assembly = "$STR_assembly.{0}" 
    $ExecutionContext.InvokeCommand.InvokeScript(
     $ExecutionContext.InvokeCommand.NewScriptBlock(" 
      function Global:$alias(`$namespace) { 
       [string](`"$assembly`" -f `$namespace) 
      } 
     ") 
    ) 
} 

E.g. se si desidera assegnare System.Windows.Forms a wforms si potrebbe chiamare la funzione principale, come

Add_Assembly_Alias System.Windows.Forms wforms 

Essa si genera la funzione chiamata "wforms" con spazio dei nomi come argomento che può essere utilizzato per aggiungere nuovi oggetti, ecc Se si desidera aggiungere, ad esempio un oggetto testo si sarebbe solo dovuto chiamare

$tb = new-object (wforms TextBox) 

non è molto, ma penso che questo sia il più vicino si può arrivare a assegnare un assemblaggio a qualcosa di simile a un alias. Purtroppo non sono riuscito a impelement questo per le chiamate dirette della forma

[Windows.Forms.MessageBox]::Show("Hello World!") 

ma spero che questo aiuta ancora.

Cheers, D

0

È possibile aggiungere PowerShell tipo di acceleratore (alias per tipo):

$accel = [PowerShell].Assembly.GetType("System.Management.Automation.TypeAccelerators") 
$accel::add("mb","System.Windows.Forms.MessageBox") 
[mb]::Show("Hello world") 

Maggiori dettagli possono essere trovati here e here.

con PowerShell 5 è anche possibile importare i namespace:

using namespace System.Windows.Forms 
[MessageBox]::Show("Hello world") 
Problemi correlati