我最近在学习PowerShell,发现了一个我无法理解的行为。让我在下面的代码中解释:
function func1()
{
Write-Output "output from func1()"
func2
return $true
}
function func2()
{
Write-Output "output from func2()"
func3
}
function func3()
{
Write-Output "output from func3()"
}
Write-Output "*** 1. run alone ****"
func1
Write-Output "*** 2. run inside if ****"
if (func1) {
#do nothing
}
直接调用func1很奇怪,它可以按预期输出消息,但如果放在“if”语句中,则不会。见输出如下:
*** 1. run alone ****
output from func1()
output from func2()
output from func3()
True
*** 2. run inside if ****
你可以看到它是空的。为什么会这样,我如何像第一个例子那样启用输出?谢谢!
答案 0 :(得分:4)
PowerShell功能与传统语言功能不同:它们可以输出多种内容。当您使用Write-Output
时,您正在向管道发送内容,因此func1()
将返回String和Boolean。如果你试试这个:
$return_values = func1;
$return_values | Get-Member
您会看到System.String
中有System.Boolean
和$return_values
个对象。实际上,'return'语句更像是传统语言中的'exit'或'break':它标记了一个退出点,但该函数实际上将返回已输出的任何内容(+可选的返回参数)。
问题的快速解决方法是将Write-Output
更改为Write-Host
,但它们的确略有不同。
答案 1 :(得分:2)
将Write-Output
替换为Write-Host
,即可获得所需的结果。如果您主要关心的是在Write-Host
中而不是转到stdout流,那么这只适用于 。
您可以在此SO帖子中详细了解2个cmdlet之间的差异:Which should I use: "Write-Host", "Write-Output", or "[console]::WriteLine"?