2012-02-10 11 views
6

Muy bien. Estoy intentando completar una tarea de la escuela y no puedo por la vida de mi entender esto. Estoy tratando de usar powershell para pasar valores de una función a otra haciendo un script de tipo "modular". Parece que no puedo imaginar cómo mover los valores fuera del alcance de la función sin usar el script $: xxxxx. ¿Hay alguna otra manera de mover los valores en powershell como un parámetro de argumento regular pasar por referencia?Powershell pasando los valores del argumento a los parámetros y viceversa

Esto es lo que tengo:

function main 
{ 
inputGrams($carbGrams, $fatGrams) 
$carbGrams 
$carbGrams 
calcGrams 
displayInfo 
} 

function inputGrams([ref]$carbGrams, [ref]$fatGrams) 
{ 
    $carbGrams = read-host "Enter the grams of carbs per day" 
    $fatGrams = read-host "Enter the grams of fat per day" 
} 

function calcGrams 
{ 
    $carbCal = $carbGrams * 4 
    $fatCal = $fatGrams * 9 
} 

function displayInfo 
{ 
    write-host "The total amount of carb calories is $carbCal" 
    write-host "The total amount of fat calories is $fatCal" 
} 

main 

Los dos valores justo después de la función inputGrams debe cambiar cada vez que se ejecuta la secuencia de comandos pero no lo hacen debido a problemas de alcance y pasando los valores. ¿Alguien sabe cómo pasar correctamente esos valores a la función principal?

+0

¿Qué parte es la tarea, información nutricional cálculo o escribir un script de PowerShell? Si este último me gusta tu escuela :-) –

Respuesta

1

Andy está en el camino correcto, pero [Ref] son ​​difíciles y se recomienda evitarlos si es posible.

Como dijiste, el problema es el alcance. Todas sus funciones -excepto principal - se invocan desde main, por lo tanto, necesita hacer que las variables estén disponibles para estas funciones configurándolas en el alcance principal, es decir, su ámbito principal, con Set-Variable o New-Variable.

El mismo punto es válido al recuperar sus valores con Get-Variable.

function main 
{ 
    inputGrams 
    $carbGrams 
    $fatGrams 
    calcGrams 
    displayInfo 
} 

function inputGrams 
{ 
    # type constrain as Single because Read-Host returns a String 
    [single]$carbs = read-host "Enter the grams of carbs per day" 
    [single]$fat = read-host "Enter the grams of fat per day" 

    # scope 1 is the parent scope, i.e. main's scope 
    Set-Variable -Name carbGrams -Value $carbs -Scope 1 
    Set-Variable -Name fatGrams -Value $fat -Scope 1 
} 

function calcGrams 
{ 
    # scope 1 is the parent scope, i.e. main's scope 
    Set-Variable -Name carbCal -Value ($carbGrams * 4) -Scope 1 
    Set-Variable -Name fatCal -Value ($fatGrams * 9) -Scope 1 
} 

function displayInfo 
{ 
    # scope 1 is the parent scope, i.e. main's scope 
    $_carbCal = Get-Variable -Name carbCal -Scope 1 -ValueOnly 
    $_fatCal = Get-Variable -Name fatCal -Scope 1 -ValueOnly 

    write-host "The total amount of carb calories is $_carbCal" 
    write-host "The total amount of fat calories is $_fatCal" 
} 

main 

PD: Espero no se echen a perder su asignación de la escuela, sólo quería ayudar;)

+0

¿Referencia a la recomendación de evasión? –

+1

p. 25 de http://www.manning.com/payette/wpia_errata.pdf – zx38

+0

El ejemplo de Bruce se comportó como me hubiera gustado ... No hubiera escogido REF sin embargo, creo que está bien para el escenario del OP. Yo, por otro lado, normalmente trato de tener una función return values ​​si se espera que produzca algo tan fácil de ver en qué ámbito se encuentran los datos. –

13

Hay algunos problemas. En primer lugar aquí es un ejemplo de trabajo:

function main 
{ 
    # 1. Create empty variable first. 
    New-Variable -Name carbGrams 
    New-Variable -Name fatGrams 

    # 2. Spaces in between parameters. Not enclosed in parens. 
    # 3. Put REF params in parens. 
    inputGrams ([ref]$carbGrams) ([ref]$fatGrams) 

    $carbGrams 
    $fatGrams 
} 

function inputGrams([ref]$carbGrams, [ref]$fatGrams) 
{ 
    # 4. Set the Value property of the reference variable. 
    $carbGrams.Value = read-host "Enter the grams of carbs per day" 
    $fatGrams.Value = read-host "Enter the grams of fat per day" 
} 

main 

y explicación:

  1. Tendrá que crear la variable antes de pasarla por el momento.
  2. No encierre los parámetros de la función PowerShell en parens, simplemente sepárelos con espacios.
  3. Coloque los argumentos REF en parens.
  4. Para establecer el valor de la variable REF, deberá establecer la propiedad Value.
+1

La propiedad "Valor" es lo que me atrapó ... ¡gracias Andy! – slashp

Cuestiones relacionadas