Szukaj…


Wprowadzenie

Można go użyć do wyjścia z bieżącego zakresu, którym może być funkcja, skrypt lub blok skryptu. W PowerShell wynik każdej instrukcji jest zwracany jako wynik, nawet bez wyraźnego słowa kluczowego Return lub w celu wskazania, że osiągnięto koniec zakresu.

Uwagi

Możesz przeczytać więcej o semantyce zwrotów na stronie about_Return w TechNet lub wywołując polecenie get-help return z monitu programu PowerShell.


Ważne pytania i odpowiedzi na pytania z większą liczbą przykładów / wyjaśnień:


about_return w MSDN wyjaśnia to zwięźle:

Słowo kluczowe Return wychodzi z funkcji, skryptu lub bloku skryptu. Można go użyć do wyjścia z zakresu w określonym punkcie, do zwrócenia wartości lub do wskazania, że osiągnięto koniec zakresu.

Użytkownicy znający języki takie jak C lub C # mogą chcieć użyć słowa kluczowego Return, aby logika pozostawienia zakresu była wyraźna.

W Windows PowerShell wyniki każdej instrukcji są zwracane jako dane wyjściowe, nawet bez instrukcji zawierającej słowo kluczowe Return. Języki takie jak C lub C # zwracają tylko wartości lub wartości określone przez słowo kluczowe Return.

Wczesne wyjście

function earlyexit {
    "Hello"
    return
    "World"
}

„Witaj” zostanie umieszczone w potoku wyjściowym, „Świat” nie

Gotcha! Wróć w przygotowaniu

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

ForEach-Object cmdlet ForEach-Object (np. ForEach-Object , Where-Object itp.) Działają na zamknięciach. Zwrot tutaj przeniesie tylko do następnego elementu w potoku, a nie zakończy przetwarzania. Możesz użyć break zamiast return, jeśli chcesz zakończyć przetwarzanie.

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

Gotcha! Ignorowanie niechcianych wyników

Zainspirowany przez

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

Out-Null jest konieczne, ponieważ metoda .NET ArrayList.Add zwraca liczbę elementów w kolekcji po dodaniu. Jeśli zostanie pominięty, rurociąg zawierałby 1, 2, "a", "b"

Istnieje wiele sposobów na pominięcie niechcianych danych wyjściowych:

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"
}

Uwaga: aby dowiedzieć się więcej o tym, dlaczego preferować > $null , zobacz [temat jeszcze nie utworzony].

Wróć z wartością

(parafrazowany od about_return )

Następujące metody będą miały takie same wartości w potoku

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

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

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

Jak pracować z funkcjami zwraca

Funkcja zwraca wszystko, co nie zostało przechwycone przez coś innego.
Jeśli użyjesz słowa kluczowego return , każda instrukcja po wierszu powrotu nie zostanie wykonana!

Lubię to:

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!"
}

Funkcja testowa
Wróci:

  • Początek
  • Nowo utworzony klucz rejestru (jest tak, ponieważ istnieją pewne instrukcje, które tworzą dane wyjściowe, których nie można się spodziewać)
  • Tak, zadziałało!

Funkcja testowa -ExceptionalReturn Zwróci:

  • Początek
  • Cholera, to nie zadziałało!

Jeśli zrobisz to w ten sposób:

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
}

Funkcja testowa
Wróci:

  • Tak, zadziałało!

Funkcja testowa -ExceptionalReturn Zwróci:

  • Cholera, to nie zadziałało!

Za pomocą tej sztuczki możesz kontrolować zwracane dane wyjściowe, nawet jeśli nie jesteś pewien, co wypluje każda instrukcja.

Działa to w ten sposób

.{<Statements>} | Out-Null

. tworzy następujący blok skryptowy zawarty w kodzie
{} oznacza blok skryptu
| Out-Null potokuje każde nieoczekiwane wyjście do Out-Null (więc zniknęło!)
Ponieważ włączono blok skryptu, ma on taki sam zasięg jak reszta funkcji.
Możesz więc uzyskać dostęp do zmiennych, które zostały utworzone w bloku skryptu.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow