2012-02-10 124 views
6

好的。我試圖完成一個學校任務,不能爲我的生活弄清楚這一點。我試圖使用PowerShell將值從一個函數傳遞給另一個,從而製作一個「模塊化」類型的腳本。我似乎無法弄清楚如何在不使用$ script:xxxxx的情況下將值移出函數的範圍。有沒有另一種方法來移動PowerShell中的值作爲一個常規參數傳遞參考?Powershell將參數值傳遞給參數並返回

這是我有:右後

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 

兩個值inputGrams功能應在每次腳本運行時間而改變,但他們這樣做,因爲範圍問題和傳遞值不是。任何人都知道如何正確地將這些值傳遞迴主函數?

+0

哪一部分是家庭作業,計算的營養信息或編寫PowerShell腳本?如果後者我喜歡你的學校:-) – 2012-02-10 05:37:59

回答

1

安迪是在正確的道路上,但[參考]是棘手和建議,如果你能避免。

正如你所說的,問題是範圍。您的所有功能-except 主要 - 從主調用,因此你需要將其設定在主要的範圍,即他們的父母範圍的,具有設置變量或新變量,使變量提供這些功能。與獲取變量獲取它們的值時

相同點是有效的。

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:我希望我沒有破壞你的作業,只是想幫忙;)

+0

參考避稅建議? – 2012-02-10 05:26:43

+1

p。 25 of http://www.manning.com/payette/wpia_errata.pdf – zx38 2012-02-10 05:53:00

+0

布魯斯的例子表現得很喜歡我期望的......我不會選擇自己的REF,但我認爲這對於OP的場景來說很好。我在另一方面通常會嘗試有一個函數的返回值,如果它預計將產生的東西這麼容易看到的數據是在什麼範圍之內。 – 2012-02-10 06:13:46

13

有幾個問題。首先這裏有一個工作示例:

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 

和解釋:

  1. 您需要在REF傳遞之前,將創建變量。
  2. 請勿將Parallels中的PowerShell函數參數括起來,只是用空格分隔它們。
  3. 將REF參數放在parens中。
  4. 要設置REF變量的值,您需要設置Value屬性。
+1

「價值」屬性是什麼讓我......謝謝安迪! – slashp 2014-04-09 15:44:13