PowerShell
Zwraca zachowanie w PowerShell
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.