2012-02-10 15 views
6

Tamam. Bir okul görevini tamamlamaya çalışıyorum ve hayatımı anlayamıyorum. Bir işlevden diğerine "modüler" yazı tipi oluşturmak için powershell kullanmaya çalışıyorum. $ Script: xxxxx kullanmadan fonksiyonun kapsamı dışında değerlerin nasıl taşınacağını anlayamıyorum. Powershell'deki değerleri, normal argüman parametresi referansı olarak geçmek için başka bir yol var mı?Powershell parametreler için bağımsız değişken değerleri iletiliyor ve geri

İşte ne var: inputGrams fonksiyonu komut her çalıştırıldığında değiştirmelidir ancak çünkü kapsam sorunları ve verileri iletmenin en do not

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 

iki değer hemen sonra. Bu değerleri düzgün bir şekilde ana işleve nasıl iletileceğini bilen var mı?

+0

neresini ödev, hesaplama beslenme bilgi veya bir PowerShell komutu yazıyor? Eğer ikincisi okulunu beğendiysem :-) –

cevap

1

Andy doğru yolda olduğunu ancak [Ref] ustalık ister ve bunu eğer bunları önlemek için tavsiye edilir.

Söylediğiniz gibi sorun kapsam. Tüm işlevleriniz - ana - hariçtir, bu nedenle, bu işlevler için kullanılabilir değişkenleri ana kapsamına, yani üst kapsamını Ayar Değişkeni veya Yeni Değişken'e ayarlayarak yapabilirsiniz.

Değerleri Get-Variable ile alırken aynı nokta geçerlidir.

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 

Not: Sadece yardım etmek istedim, senin okul atama değil yağma umut;)

+0

Kaçınma önerisine referans mı? –

+1

p. Http://www.manning.com/payette/wpia_errata.pdf adresinden 25 – zx38

+0

Bruce'un örneklediği gibi davrandım. Beklediğim gibi ... REF'i kendim seçmedim, ancak OP'nin senaryosunun iyi olduğunu düşünüyorum. Diğer taraftan, verilerin hangi kapsamda olduğunu görmek çok kolay bir şey üretmesi beklenirse, tipik olarak bir işlev dönüş değeri elde etmeye çalışın. –

13

Bazı sorunlar var.

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 

Ve açıklama: Sen REF tarafından geçirmeden önce değişken oluşturmak gerekir

  1. İlk burada çalışan bir örnek.
  2. PowerShell işlev paramlarını parantez içine alma, sadece boşluklarla ayırma.
  3. REF bağımsız değişkenlerini parantez içinde koyun.
  4. REF değişkeninin değerini ayarlamak için, Value özelliğini ayarlamanız gerekir.
+1

"Değer" özelliği bana ne kazandırdı ... teşekkürler Andy! – slashp

İlgili konular