2011-12-29 9 views
5

Así que si tengo el siguiente código:problemas para volver tabla hash

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo["site"] 

¿Por qué no $ SITEINFO [ "sitio"] retorno "algo"?

puedo afirmar simplemente ....

$siteInfo 

y volverá

else 

Key: site 
Value: Something 
Name: site 

Key: app 
Value: else 
Name: app 

¿Qué me falta?

+0

'$ SITEINFO [ "sitio"]' 'no volver Something' para mí. – Rynant

+0

para mí también, versión Powershell? –

+0

Ok, tengo algo más de información. Agregué una simple llamada a una variable ($ app) de arriba en mi código de función. Lo que ocurría era que el valor de $ app y la tabla hash se devolvía a la variable que llamaba a la función. Entonces, si hiciera un ($ siteInfo | fl) mostraría tanto "else" como las dos claves/valores. ¿Porqué es eso? – pghtech

Respuesta

12

En PowerShell, las funciones devuelven todos y cada uno de los valores que devuelve cada línea en la función; una declaración explícita return no es necesaria.

El método String.IndexOf() devuelve un valor entero, por lo que en este ejemplo, DoSomething devuelve '2' y la tabla hash como matriz de objetos que se observan con .GetType().

function DoSomething { 
    $site = "Something" 
    $app = "else" 
    $app.IndexOf('s') 
    return @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo.GetType() 

El siguiente ejemplo muestra 3 maneras de bloquear la salida no deseada:

function DoSomething { 
    $site = "Something" 
    $app = "else" 

    $null = $app.IndexOf('s') # 1 
    [void]$app.IndexOf('s')  # 2 
    $app.IndexOf('s')| Out-Null # 3 

    # Note: return is not needed. 
    @{"site" = $($site); "app" = $($app)} 
} 

$siteInfo = DoSomething 
$siteInfo['site'] 

Aquí es un ejemplo de cómo envolver varias instrucciones en una ScriptBlock para capturar la salida no deseada:

function DoSomething { 
    # The Dot-operator '.' executes the ScriptBlock in the current scope. 
    $null = .{ 
     $site = "Something" 
     $app = "else" 

     $app 
    } 

    @{"site" = $($site); "app" = $($app)} 
} 

DoSomething 
+0

@Gracias Rynant: en este ejemplo, ¿no hay una mejor manera de administrar los valores devueltos? Es muy común establecer variables, pero tener que retroceder y bloquear el retorno de cada posible valor de retorno convierte a unas pocas funciones de línea en un lío feo. ¿Podría filtrar I.E.> FunctionName | $ _. para llegar a un valor de retorno? – pghtech

+1

@pghtech - En la práctica, no he encontrado que haya muchas veces que deba bloquear explícitamente un valor de retorno, ya que generalmente estoy usando el valor de retorno o no hay un valor de retorno. Aunque no sé si lo he visto en la práctica, supongo que podría envolver todo con '$ null =. {<# Function contents #>}, pero preferiría usar' Out-Null' y similares cuando necesario. – Rynant

+0

En serio, ¿por qué? ¡Casi rompí mi laptop tratando de hacer algunas funciones ***! – Geoffroy

1

@Rynant MUY útil publicación, gracias por proporcionar ejemplos sobre la función de ocultación de salida!

Mi solución propuesta:

function DoSomething ($a,$b){ 
    @{"site" = $($a); "app" = $($b)} 
} 

$c = DoSomething $Site $App 
Cuestiones relacionadas