2011-12-13 12 views
7

Recientemente descubrí que las funciones de Powershell son simplemente llamadas scriptblocks. Por ejemploNombre del comando de referencia con guiones

function HelloWorld { 
    Write-Output "Hello world" 
} 

$hw = $function:HelloWorld 

& $hw  

ejecutará el método HelloWorld.

Sin embargo, lo que no he sido capaz de averiguar, es cómo obtener una referencia a un método que tiene un guión en su nombre:

function Hello-World { 
    Write-Output "Hello world" 
} 

$hw = $function:Hello-World 

You must provide a value expression on the right-hand side of the '-' operator. 
At line:1 char:27 
+  $hw = $function:Hello- <<<< World 
    + CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : ExpectedValueExpression 

¿Alguna idea?

Soy consciente de que podía hacer algo como:

$hw = (Get-Item function:Hello-World).ScriptBlock 

pero es un poco "ruidoso" y me gusta la sintaxis de la función $

Respuesta

3

Doh! Debería haberme quedado con el Programmer Problem Solving Sequence y haber preguntado a mis compañeros de trabajo antes de que publiqué en SO. Parece que debería usar:

$hw = ${function:Hello-World} 
+0

Esto no funciona para mí. Ejecutar $ {función: Get-Item} no da nada – digitguy

2

Para invocar la función, todo lo que necesita hacer es llamarlo por su nombre.

PS> Hello-World 
Hello world 

${function:Hello-World} es la manera de obtener el código de la función. Aquí hay otra manera:

Get-Command Hello-World | Select-Object -ExpandProperty Definition 
3

Así como el uso $script = ${function:hello-world} también hay $script = get-content function:hello-world. '$' como operador unario equivale a usar get-content (alias es gc)

+1

¡Ah! Es un buen factoid sobre "$" ... ¡Siento que todos mis guiones se verán pronto como jQuery! –

+0

@ x0n Esto no funciona para mí. Ejecutar $ {function: Get-Item} no da nada. – digitguy

+0

¿Podría ser porque Get-Item es un comando, pero x0n está hablando de referencias de función? –

Cuestiones relacionadas