PowerShell ISE 中 Echo 和 Write-Host 的区别

San*_*ann 4 powershell echo powershell-ise

我开始学习(初学者)PowerShell 脚本。我发现echo两者Write-Host都可以在控制台屏幕上显示输出,那么它们之间有什么区别呢?我从 Stack Overflow 上读到了这个问题,但我无法理解它的答案。我想简单地了解其中的差异。

Sim*_*onS 5

我将尝试从哲学上而不是技术上向您解释它。

  • Write-Host用于在控制台中显示信息。它不会被写入输出流
  • echo,实际上是 的别名,Write-Output用于输出操作的对象

考虑以下示例:

这段代码在这里:

$Results = 0..10 | ForEach-Object {
    Write-Host "Current Number: $_"
    $_
}
Run Code Online (Sandbox Code Playgroud)

将在控制台输出以下内容:

Current Number: 0
Current Number: 1
Current Number: 2
Current Number: 3
Current Number: 4
Current Number: 5
Current Number: 6
Current Number: 7
Current Number: 8
Current Number: 9
Current Number: 10
Run Code Online (Sandbox Code Playgroud)

如果你现在检查变量$Results,你可以看到:

PS C:\WINDOWS\system32> $Results
0
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

这些数字被保存到变量中,因为$_线上没有。3 被发送到输出流。Write-Host但是,它被发送到主机,因此它显示在控制台中,但不会显示在变量中,因为它不会在输出流中创建任何内容。

Write-Host如果我们更改为?:现在会发生什么Write-Output

$Results = 0..10 | ForEach-Object {
    Write-Output "Current Number: $_"
    $_
}
Run Code Online (Sandbox Code Playgroud)

如果我们运行它,我们将不会在控制台中看到任何内容,因为整个输出流都保存在变量中$Results。如果我们现在检查这个变量,它看起来像这样:

PS C:\WINDOWS\system32> $Results
Current Number: 0
0
Current Number: 1
1
Current Number: 2
2
Current Number: 3
3
Current Number: 4
4
Current Number: 5
5
Current Number: 6
6
Current Number: 7
7
Current Number: 8
8
Current Number: 9
9
Current Number: 10
10
Run Code Online (Sandbox Code Playgroud)

因此,正如您所看到的,如果您想打印简单的信息,除了告诉您代码当前正在做什么之外,实际上没有其他用处,您可以使用Write-Host

如果你想向输出流输出任何内容,你可以使用Write-Output

但坚持住!还有更多。

你实际上并不需要Write-Output。我编写 PowerShell 脚本已经有大约 5、6 年了,但我一次都没有使用过它。为什么?因为写入输出流是 PowerShell 中的默认设置。如果您再次查看我们的示例,$_即使我没有使用 .online ,第三行总是神奇地进入输出流Write-Output

总结一下:用于Write-Host在控制台中显示信息,我建议不要使用echo/Write-Output因为它是默认值。