Примечание: этот ответ дополняет мой (уже длинный) другой , чтобы ответить на некоторые из ваших анализов в вопросе:
Я понимаю это return
выводится на консоль и не имеет «вывода», например, например, Write-Host
Это Write-Host
, которое не выводится в данные смысл : то есть не записывает в поток успешного вывода (номер потока 1
- см. about_Redirection
)
Вместо этого он записывает на хост (дисплей; в PSv5 + он делает это через поток 6
, информационный поток), минуя поток успешного вывода, предотвращение захвата или перенаправления вывода - см. этот ответ для получения справочной информации, в том числе когда уместно использование Write-Host
(а не Write-Output
/ неявный вывод).
Напротив, return
отправляет вывод из своего (необязательного) операнда [1] в поток успешного вывода am .
Что касается удивительного поведения:
PS> $test = return "test"
test
Вы попали в крайний случай (обсуждается в этой закрытой проблеме GitHub ): что-то, что синтаксически разрешено , но не имеет смысла делать : оператор return
эффективно сокращает присвоение : это есть, "test"
отправляется непосредственно в выходной поток успеха (1
), а присвоение игнорируется , потому что оператор управления потоком return
выходит из охватывающей области - не только заявление! - до того, как произойдет присвоение .
Вы можете убедиться, что return
действительно все еще нацелен на успешный выходной поток следующим образом:
PS> $testOuter = & { $test = return "test" }; "[$testOuter]"
[test] # proof that $testOuter was able to capture the `return` value.
Однако этой проблемы легко избежать: любое выражение или команду (конвейер) можно напрямую использовать в качестве RHS.
# Do NOT use `return` in the RHS of an assignment.
PS> $test = "test"; "[$test]"
[test]
[1] Хотя использование return
с выражением (например, return $foo
), вероятно, является наиболее распространенным, обратите внимание, что он поддерживает весь конвейер в качестве своего операнд (например, return Get-Date | % Year
).