Powershell, передавая значения аргументов параметрам и обратно - PullRequest
6 голосов
/ 10 февраля 2012

Хорошо. Я пытаюсь выполнить школьное задание и никак не могу понять это. Я пытаюсь использовать powershell для передачи значений из одной функции в другую, создавая сценарий «модульного» типа. Я не могу понять, как переместить значения из области действия функции без использования $ script: xxxxx. Есть ли другой способ переместить значения в 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 должны изменяться при каждом запуске скрипта, но они не изменяются из-за проблем с областью действия и передачи значений. Кто-нибудь знает, как правильно передать эти значения обратно в основную функцию?

Ответы [ 2 ]

13 голосов
/ 10 февраля 2012

Есть несколько проблем. Сначала вот рабочий пример:

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. Не заключайте параметры функций PowerShell в парены, просто разделяйте их пробелами.
  3. Положите аргументы REF в скобках.
  4. Чтобы установить значение переменной REF, вам нужно установить свойство Value.
1 голос
/ 10 февраля 2012

Энди на правильном пути, но [Ref] хитры, и рекомендуется избегать их, если вы можете .

Как вы сказали, проблема в объеме.Все ваши функции, кроме main , вызываются из main, поэтому вам нужно сделать переменные доступными для этих функций, установив их в области действия main , то есть в родительской области, с помощьюSet-Variable или New-Variable.

Та же точка действительна при получении их значений с помощью 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: надеюсь, я не испортил ваше школьное задание, просто хотелвыручить;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...