向脚本操作员写入消息的能力非常重要。有多种方法可以做到这一点。我们已经介绍了 写主机 .现在,我们将探索写入输出。
这些命令在许多方面都是相似的。这两个命令都会在屏幕上键入一条消息,供操作员查看。
Write-Host "Message A"
Write-Output "Message B"
这些命令执行几乎相同的操作。这两个命令都会向控制台显示一条消息,供脚本操作员读取。
要了解其中的区别,我们首先需要了解PowerShell的管道机制。
3.3.4 管道PowerShell 允许我们使用管道运算符 (|) 字符将一个命令的输出作为另一个命令的输入发送。让我们看一下实际使用读取主机和写入主机 cmdlet 的管道机制。以前,我们使用读取主机 cmdlet 将值输入到我们创建的变量中,然后可以通过使用写入主机 cmdlet 将$Name变量的值输出到控制台来验证此输入。
$Name=Read-Host "What’s your Name?"
Write-Host $Name
利用管道机制,我们可以完全跳过变量,只需将用户从读取主机输入的值直接传送到带有写入主机的控制台中。
Read-Host "What’s your name?"|Write-Host
图3.9 PowerShell的管道机制细分。
请注意,在此代码中,我们没有将任何内容存储为变量。我们只是获取第一个命令(Read-Host)的输出,并将其直接传送到第二个命令(Write-Host)的输出。
3.3.5 写输出现在我们已经熟悉了 Windows PowerShell 中的管道机制,我们可以说明写入主机和写入输出 cmdlet 之间的区别。
写入主机不能将信息存储为变量。它将其输出直接发送到控制台。将其视为向用户显示的消息框。显示消息后,它就消失了。
但是,写入输出可以在变量中存储信息。您可以将输出提供给用户,然后在另一个函数(例如日志)中使用相同的输出,而无需将数据分配给变量重新捕获或重新创建它。
注意以下代码不是通常在 PowerShell 中执行的操作,但出于演示目的,它将说明写入主机和写入输出之间的区别。随着 PowerShell 技能集的增长,你将很快看到写入输出 cmdlet 的更多适用用法。
$First_Name="John"|Write-Host
$Last_Name="Doe"|Write-Output
Write-Host "Your name is $First_Name $Last_Name"
图 3.10 操作中的写主机和写输出之间的差异
如您所见,当我们使用 Write-Host 时,消息被输出到操作员控制台,但实际上并没有存储为变量。$Last_Name 存储为变量,后来被我们的脚本按预期使用。
3.3.6 三通对象Tee-Object 制作第二个副本并重定向输出。它像 (T) 交集一样向两个不同的方向发送输出。数据在两个不同的方向上分支。我们将在下面的代码中说明这个概念。
首先,我们将使用写入输出 cmdlet 写出文本“***重要消息***,这可能表示任何重要消息或可记录事件。然后,我们将此输出通过管道传输到 Tee 对象 Cmdlet。 Tee-Object 将在代码中创建一个分支。一个分支将被发送到输出,另一个分支将被捕获为名为 $second_place 的变量。
然后,我们将写出 $second_place 变量的值,以验证“***重要消息***”是否已发送到这两个位置。
Clear-Host
Write-Output "***IMPORTANT MESSAGE***"|Tee-Object -Variable second_place
Write-Host "The first place it went was to the screen. The second place it will go is the ‘second_place’ variable."
Write-Host "The variable contains: "$second_place
图 3.11 运行中的 Tee-Object cmdlet 示例
此外,我们可以利用 Tee-Object cmdlet 将数据发送到变量以外的位置。在 Tiny Project 代码中,我们利用 Tee-Object cmdlet 将数据同时发送到控制台和日志文件。
图 3.12 要发送到日志文件的 Tee-Object 示例