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

bob*_*uan 8 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
}
Run Code Online (Sandbox Code Playgroud)

直接调用func1时很奇怪,它可以按预期输出消息,但是如果放在"if"语句中,它就不会.见输出如下:

*** 1. run alone ****
output from func1()
output from func2()
output from func3()
True
*** 2. run inside if ****
Run Code Online (Sandbox Code Playgroud)

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

Raf*_*Raf 7

您可以通过替换Write-Output为来获得所需的结果Write-Host。这是适合只有当你的主要关注是产生在控制台输出Write-Host并没有去到stdout流。

您可以阅读有关此 SO 线程中 2 个 cmdlet 之间差异的更多信息:我应该使用哪个:“Write-Host”、“Write-Output”或“[console]::WriteLine”?


Pet*_*erK 7

PowerShell函数与传统语言的函数不同:它们可以输出多个内容。使用时Write-Output,您正在沿管道发送消息,因此func1()将同时返回String和Boolean。如果您尝试这样做:

$return_values = func1;
$return_values | Get-Member
Run Code Online (Sandbox Code Playgroud)

您将看到同时包含System.String和System.Boolean对象$return_values。实际上,“ return”语句更像是传统语言中的“ exit”或“ break”:它标记了一个出口点,但是该函数实际上将以已经输出的任何内容返回(+可选的return参数)。

快速解决此问题的方法是将更Write-Output改为Write-Host,尽管他们做的事情略有不同。