Поиск…


Вступление

Его можно использовать для выхода из текущей области, которая может быть функцией, сценарием или сценарием. В PowerShell результат каждого оператора возвращается как результат, даже без явного ключевого слова Return или для указания того, что конец области был достигнут.

замечания

Вы можете больше узнать о семантике возврата на странице about_Return на TechNet или вызвать get-help return из приглашения PowerShell.


Известные вопросы и ответы с большим количеством примеров / объяснений:


about_return на MSDN объясняет это кратко:

Ключевое слово Return выходит из функции, скрипта или скриптового блока. Его можно использовать для выхода из области в определенной точке, для возврата значения или для указания того, что конец области был достигнут.

Пользователи, знакомые с такими языками, как C или C #, могут захотеть использовать ключевое слово Return, чтобы логика оставила явную область видимости.

В Windows PowerShell результаты каждого оператора возвращаются как выходные данные, даже без оператора, содержащего ключевое слово Return. Языки, такие как C или C #, возвращают только значение или значения, заданные ключевым словом Return.

Ранний выход

function earlyexit {
    "Hello"
    return
    "World"
}

«Привет» будет помещен в выходной конвейер, «Мир» не будет

Попался! Возвращение в трубопровод

get-childitem | foreach-object { if ($_.IsReadOnly) { return } } 

Командлеты трубопроводов (например: ForEach-Object , Where-Object и т. Д.) Работают при закрытии. Возврат здесь будет двигаться только к следующему элементу на конвейере, а не к завершению обработки. Вы можете использовать break вместо возврата, если хотите выйти из обработки.

get-childitem | foreach-object { if ($_.IsReadOnly) { break } } 

Попался! Игнорирование нежелательного вывода

Вдохновленный

function bar {
 [System.Collections.ArrayList]$MyVariable = @()
 $MyVariable.Add("a") | Out-Null
 $MyVariable.Add("b") | Out-Null
 $MyVariable
}

Out-Null необходим, потому что метод .NET ArrayList.Add возвращает количество элементов в коллекции после добавления. Если опустить, трубопровод будет содержать 1, 2, "a", "b"

Существует несколько способов опустить нежелательный вывод:

function bar
{
    # New-Item cmdlet returns information about newly created file/folder
    New-Item "test1.txt" | out-null
    New-Item "test2.txt" > $null
    [void](New-Item "test3.txt")
    $tmp = New-Item "test4.txt"
}

Примечание. Чтобы узнать больше о том, почему предпочитаете > $null , см. [Тема еще не создана].

Возврат со значением

(перефразированный от about_return )

Следующие методы будут иметь те же значения на конвейере

function foo {
    $a = "Hello"
    return $a
}

function bar {
    $a = "Hello"
    $a
    return
} 

function quux {
    $a = "Hello"
    $a
} 

Как работать с функциями возвращается

Функция возвращает все, что не захвачено чем-то другим.
Если u использует ключевое слово return , каждый оператор после строки возврата не будет выполнен!

Как это:

Function Test-Function
{
    Param
    (
        [switch]$ExceptionalReturn
    )
    "Start"
    if($ExceptionalReturn){Return "Damn, it didn't work!"}
    New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
    Return "Yes, it worked!"
}

Тест-Function
Вернусь:

  • Начните
  • Недавно созданный раздел реестра (это потому, что есть некоторые операторы, которые создают вывод, которого вы не можете ожидать)
  • Да, это сработало!

Test-Function -ExceptionalReturn Вернет:

  • Начните
  • Черт, это не сработало!

Если вы сделаете это так:

Function Test-Function
{
    Param
    (
        [switch]$ExceptionalReturn
    )
    . {
       "Start"
        if($ExceptionalReturn)
        {
            $Return = "Damn, it didn't work!"
            Return
        }
        New-ItemProperty -Path "HKCU:\" -Name "test" -Value "TestValue" -Type "String"
        $Return = "Yes, it worked!"
        Return 
    } | Out-Null
    Return $Return
}

Тест-Function
Вернусь:

  • Да, это сработало!

Test-Function -ExceptionalReturn Вернет:

  • Черт, это не сработало!

С помощью этого трюка вы можете контролировать возвращенный вывод, даже если вы не знаете, что будет вызывать каждое утверждение.

Он работает так

.{<Statements>} | Out-Null

. делает следующий скриптовый блок включен в код
{} отмечает блок сценария
| Out-Null передает любой неожиданный вывод в Out-Null (так что он ушел!)
Поскольку включен скриптовый блок, он получает ту же область действия, что и остальная часть функции.
Таким образом, вы можете получить доступ к переменным, которые были сделаны внутри скриптового блока.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow