2012-02-10 36 views
6

Được rồi. Tôi đang cố gắng hoàn thành một bài tập ở trường và không thể cho cuộc sống của tôi hình dung ra điều này. Tôi đang cố gắng sử dụng PowerShell để truyền các giá trị từ một hàm này sang hàm khác tạo ra một kiểu kịch bản lệnh "kiểu mô-đun". Tôi không thể tìm ra cách di chuyển các giá trị ra khỏi phạm vi chức năng mà không sử dụng $ script: xxxxx. Có cách nào khác để di chuyển các giá trị trong PowerShell như một tham số đối số thông thường đi qua tham chiếu?Giá trị đối số truyền qua Powershell tham số và quay lại

Dưới đây là những gì tôi có:

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 

Hai giá trị ngay sau khi inputGrams chức năng nên thay đổi mỗi lần kịch bản được chạy nhưng họ làm không phải vì vấn đề phạm vi và chuyển giá trị. Bất cứ ai biết làm thế nào để đúng cách vượt qua những giá trị trở lại chức năng chính?

+0

phần nào là bài tập về nhà, tính toán thông tin dinh dưỡng hoặc viết một kịch bản PowerShell? Nếu sau này tôi thích trường học của bạn :-) –

Trả lời

1

Andy đang đi đúng hướng nhưng [sửa] rất phức tạp và bạn nên tránh chúng nếu bạn có thể.

Như bạn đã nói, sự cố là phạm vi. Tất cả các chức năng của bạn - ngoại trừ chính - được gọi từ chính, do đó bạn cần phải biến các biến này thành các hàm này bằng cách đặt chúng trong phạm vi chính của, tức là phạm vi gốc của chúng, với Biến có thể đặt hoặc Biến mới.

Cùng một điểm là hợp lệ khi truy xuất giá trị của chúng bằng Nhận biến.

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: Tôi hy vọng tôi không làm hỏng trường chuyển nhượng của mình, chỉ muốn giúp đỡ;)

+0

Tham chiếu đến đề xuất tránh? –

+1

p. 25 của http://www.manning.com/payette/wpia_errata.pdf – zx38

+0

Ví dụ của Bruce cư xử như tôi mong đợi ... Tôi sẽ không chọn REF bản thân mình tuy nhiên tôi nghĩ rằng đó là tốt cho kịch bản của OP. Mặt khác, tôi thường cố gắng để có một giá trị trả về hàm nếu nó được mong đợi để tạo ra một thứ gì đó dễ dàng để xem phạm vi dữ liệu nằm ở đâu. –

13

Có một số vấn đề. Trước tiên hãy xem một ví dụ làm việc:

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 

Và lời giải thích:

  1. Bạn sẽ cần phải tạo ra các biến trước khi đi qua nó bằng cách REF.
  2. Không kèm theo các thông số chức năng PowerShell trong các lần parens, chỉ cần tách chúng bằng dấu cách.
  3. Đặt các đối số REF trong các lần parens.
  4. Để đặt giá trị của biến REF, bạn sẽ cần đặt thuộc tính Giá trị.
+1

Tài sản "Giá trị" là những gì đã cho tôi ... cảm ơn Andy! – slashp

Các vấn đề liên quan