PowerShell写入输出“if”内部不输出任何内容

时间:2014-07-02 07:55:58

标签: powershell

我最近在学习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 ****

你可以看到它是空的。为什么会这样,我如何像第一个例子那样启用输出?谢谢!

2 个答案:

答案 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"?