2012-02-10 16 views
6

OK. Sto tentando di completare un incarico scolastico e non riesco a capire come funziona la mia vita. Sto cercando di usare powershell per passare valori da una funzione all'altra facendo uno script di tipo "modulare". Non riesco a capire come spostare i valori fuori dall'ambito della funzione senza utilizzare $ script: xxxxx. Esiste un altro modo per spostare i valori in PowerShell come parametro di argomento regolare pass per riferimento?Powershell che trasmette i valori degli argomenti ai parametri e torna

Ecco quello che ho:

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 

I due valori subito dopo la funzione inputGrams dovrebbe cambiare ogni volta che lo script viene eseguito, ma non fare a causa di problemi di portata e passando i valori. Qualcuno sa come passare correttamente quei valori alla funzione principale?

+0

Quale parte è lavoro, calcolando informazioni nutrizionali o scrivere uno script PowerShell? Se quest'ultimo mi piace la tua scuola :-) –

risposta

1

Andy è sulla strada giusta, ma [Ref] sono difficile e si consiglia di evitare, se possibile.

Come hai detto, il problema è l'ambito. Tutte le funzioni, ad eccezione di principale, vengono chiamate da main, pertanto è necessario rendere le variabili disponibili per queste funzioni impostandole nell'ambito principale, ovvero l'ambito principale, con Set-Variable o New-Variable.

Lo stesso punto è valido quando si recuperano i loro valori 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 

PS: Spero di non rovinare il vostro compito scolastico, volevo solo dare una mano;)

+0

Riferimento alla raccomandazione di evitare? –

+1

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

+0

L'esempio di Bruce si è comportato come mi sarei aspettato ... Non avrei scelto REF da solo, tuttavia penso che sia soddisfacente per lo scenario dell'OP. D'altra parte, in genere, cerco di avere una funzione restituisce valori se si prevede che generi qualcosa di così facile da vedere in che ambito si trovano i dati. –

13

Ci sono alcuni problemi. In primo luogo Ecco un esempio di lavoro:

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 

e la spiegazione:

  1. Avrai bisogno di creare la variabile prima di passarlo da REF.
  2. Non racchiudere i parametri della funzione PowerShell in Paren, basta separarli con spazi.
  3. Inserire gli argomenti REF in parentesi.
  4. Per impostare il valore della variabile REF, è necessario impostare la proprietà Value.
+1

La proprietà "Value" è ciò che mi ha fatto ... grazie Andy! – slashp

Problemi correlati