PowerShell
Возвратное поведение в PowerShell
Поиск…
Вступление
Его можно использовать для выхода из текущей области, которая может быть функцией, сценарием или сценарием. В PowerShell результат каждого оператора возвращается как результат, даже без явного ключевого слова Return или для указания того, что конец области был достигнут.
замечания
Вы можете больше узнать о семантике возврата на странице about_Return на TechNet или вызвать get-help return
из приглашения PowerShell.
Известные вопросы и ответы с большим количеством примеров / объяснений:
- Возвращаемое значение функции в PowerShell
- 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 (так что он ушел!)
Поскольку включен скриптовый блок, он получает ту же область действия, что и остальная часть функции.
Таким образом, вы можете получить доступ к переменным, которые были сделаны внутри скриптового блока.