Как использовать функцию powershell для возврата ожидаемого значения? - PullRequest
0 голосов
/ 11 сентября 2018

Как мы знаем, PowerShell имеет дурацкую семантику возврата.

Возвращаемое значение функции в PowerShell показывает, что есть две основные идеи, чтобы обернуть мою голову:

  • Весь вывод захватывается и возвращается
  • Ключевое слово return просто указывает на логическую точку выхода

Даже такие вещи, как резервирование переменных во внешних областях, вызывают вывод, например [boolean]$isEnabled. Еще один хороший пример - $someCollection.Add("toto"), который выплевывает счет новой коллекции. Даже функция Append() вызывает вывод.

Например:

Function MyFunc {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi");
        $res2 = "toto"

        return $res2
}

$s = MyFunc
Write-Host $s

Вывод: titi toto.

Ожидаемый результат должен быть toto.

Как использовать функцию powershell для возврата ожидаемого значения? (по крайней мере, если смотреть с более традиционной точки зрения программирования)

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

если с помощью 'toto' вы пытаетесь понять, успешно ли выполнялась ваша функция, вы можете сделать

Function MyFunc {
    $res1 = new-object System.Text.StringBuilder
    $res1.Append("titi") | Out-Null
    return $?
}

"$?"возвращает логическое значение, если предыдущая команда выполнена успешно (true) или не выполнена (false).так внешне это будет выглядеть

$s = MyFunc
if ($s) {
    Write-Host "successful" -Foregroundcolor Green
}
else {
    Write-Error "unsuccessful"
}
0 голосов
/ 12 сентября 2018

Когда PowerShell разрабатывался, команда хотела сделать его простым в использовании.Но это сбивало с толку людей, которые знают return с других языков.Реализация в классах - это попытка исправить эту ошибку.

Ключевое слово return работает совершенно по-разному в методах классов PowerShell.Он работает как операторы return на других языках.

В методе класса ключевое слово return:

  • Выход из текущей области.
  • Возвращаетсвязанный объект (return).
  • Возвращает только связанный объект.
  • Объект, который возвращает Return, должен соответствовать типу возврата метода.

Этосоответствует ключевому слову return и аналогичным ключевым словам на других языках.

class ClassMyFunc
{
    [string] MyFunc
    {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi")
        $res2 = "toto"

        return $res2
    }
}

$cmf = New-Object -TypeName ClassMyFunc
$cmf.MyFunc()

Вывод: toto, как и ожидалось.Использование классов решило мою проблему, без необходимости искать все функции, возвращающие значение в консоли и передающие его в Out-Null (как предложено @ TobyU ).

0 голосов
/ 11 сентября 2018

Изменение

$res1.Append("titi");

до

$res1.Append("titi") | Out-Null

потому что функция возвращает все выходные данные, которые в противном случае были бы видны в консоли.

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