PowerShell Write-Output: 你友好的输出伙伴

与沉闷、可预测的脚本输出说再见吧!通过 PowerShell 的 Write-Output 命令,您可以为您的 PowerShell 脚本增添一丝创意和个性。

Write-Output 命令是一个强大的工具,也是您自动化和系统管理需求的完美伴侣。在本教程中,您将学会如何最大化 Write-Output 命令的潜力。

准备好了吗?继续阅读,发现 Write-Output 命令的魔力吧!

先决条件

本教程将进行实践演示。请确保您有一台安装了 PowerShell 的计算机(最好是最新版本)。本教程使用安装了 PowerShell 7 的 Windows 10。

输出对象到控制台

PowerShell 的 Write-Output 命令将对象写入输出流,并在控制台显示命令或消息的输出。但您会惊讶地发现这个工具如何使输出更有意义和价值。

代替在控制台中显示输出,使用 Write-Output cmdlet来自定义输出。 Write-Output cmdlet可以输出任何对象或数据类型,如字符串,整数,数组,甚至是复杂对象。

运行以下命令将 Hello, World! 消息输出到控制台。

Write-Output "Hello, World!”

以下是 Write-Output cmdlet的最基本功能。 但是继续阅读以了解更多此cmdlet的中级到高级用法。 <>

Outputting objects to the console

将对象传递给另一个命令

除了在控制台中显示输出外,您还可以使用 Write-Output 命令将对象发送到另一个命令进行进一步处理。 如何? 通过使用管道运算符( | )。 流水线处理 使 Write-Output 成为自动化和系统管理任务的方便而多功能的命令。

假设您想查看哪个进程消耗了大部分资源,例如CPU。

运行以下命令执行以下操作:

  • 检索系统上运行的所有进程的列表( Get-Process )。
  • 将列表输出到管道,然后传递给Sort-Object命令。管道运算符允许您将多个命令链接在一起,并将一个命令的输出作为另一个命令的输入进行处理。
  • 按照它们的CPU使用情况按-Descending顺序对进程列表进行排序(Sort-Object)。
$processes = Get-Process
Write-Output $processes | Sort-Object CPU -Descending

请注意,您可以将本教程中的任何命令放入PowerShell脚本中并运行它。

排序后的列表显示在控制台中,如下所示。

Passing objects to another command

使用自定义格式输出对象

您已经看到了Write-Output cmdlet的基本输出格式,这很好用。但如果您愿意,您也可以输出带有自定义格式的对象以添加个人风格。当您希望显示特定对象属性或自定义输出外观时,自定义格式可能很有用。

要使用自定义格式输出对象,Format-CustomWrite-Output cmdlet一起使用,如下所示:

创建自定义输出格式,然后将Format-Custom cmdlet的输出导入Write-Output。<>

运行下面的命令,它不会产生输出,而是创建一个包含三个属性及其相应值以输出的对象(一个散列表)。

$object = [pscustomobject]@{
Property1 = "Value1"
Property2 = "Value2"
Property3 = "Value3"
}

现在,运行下面的命令执行以下操作:

  • 为哈希表的输出(Write-Output)创建自定义格式(Format-Table)。将 Property1Property2Property3 属性设置为列。
  • 调整列宽(-AutoSize)以适应内容。
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

或者,您可以使用 Format-List 命令与 Write-Output 将对象输出为属性-值对的列表。

$object | Format-List -Property Property1, Property2, Property3 | Write-Output
Outputting the object as a list of property-value pairs

将集合对象作为单个实体传递

默认情况下,Write-Output 将每个集合元素单独通过管道发送,这个过程称为枚举。但是,您可以通过附加 -NoEnumerate 参数来阻止此行为,将整个集合对象作为单个实体传递。

要查看 -NoEnumerate 参数的工作原理,按照以下步骤操作:

运行下面的命令执行以下操作:

  • 声明一个从一到三的 $numbers 数组(1,2,3)。
  • 计算通过管道传递的对象数目(Measure-Object)。
  • 输出对象测量(Write-Output $numbers)。

没有使用NoEnumerate参数,Measure-Object返回计数为三(3),因为$numbers数组的每个元素都被枚举并单独通过管道传递。

# 声明一个数组
$numbers = 1,2,3
# 输出通过管道传递的对象计数
Write-Output $numbers | Measure-Object
Outputting an array object measurement

现在,运行以下命令以输出通过管道传递的对象计数。

但是,由于您附加了-NoEnumerate参数,Measure-Object命令将对象视为单个实体,返回计数为一(1)。

# 声明一个数组
$numbers = 1,2,3
# 输出作为单个实体通过管道传递的对象计数
Write-Output -NoEnumerate $numbers | Measure-Object
Outputting object count as a single entity

Write-Output命令放在括号中(即(Write-Output 1,2,3))将强制进行枚举,而不管-NoEnumerate参数如何。

创建菜单系统和输入提示

使用Write-Output命令创建一个带有PowerShell脚本的菜单系统,提示用户输入。

使用首选的文本/代码编辑器创建一个.ps1文件,填充下面的代码,并保存文件。您可以根据喜好命名文件,但本教程选择myoutput.ps1

下面的代码使用循环不断提示用户从选项列表中选择选项,直到用户选择退出选项。

# 将 $exit 变量初始化为 $false
$exit = $false

# 启动一个循环,直到用户选择“退出”选项
while (!$exit) {

  # 向用户显示选项列表
  Write-Output "Please select from the following options:"
  Write-Output "1. Option 1"
  Write-Output "2. Option 2"
  Write-Output "3. Option 3"
  Write-Output "4. Exit"

  # 提示用户进行选择
  $selection = Read-Host

  # 使用 switch 语句根据用户的选择执行不同的代码
  switch ($selection) {
    1 {
      # 如果用户选择选项 1,则显示消息并针对选项 1 执行某些操作
      Write-Output "You selected Option 1."
      # 为选项 1 执行某些操作
    }
    2 {
      # 如果用户选择选项 2,则显示消息并针对选项 2 执行某些操作
      Write-Output "You selected Option 2."
      # 为选项 2 执行某些操作
    }
    3 {
      # 如果用户选择选项 3,则显示消息并针对选项 3 执行某些操作
      Write-Output "You selected Option 3."
      # 为选项 3 执行某些操作
    }
    4 {
      # 如果用户选择选项 4,则将 $exit 设置为 $true 以退出循环
      $exit = $true
    }
  }
}

现在,从工作目录中运行脚本(myoutput.ps1)。

./myoutput.ps1

如下所示,当您选择选项 123 时,将显示与您的选择相关联的消息。但是当您选择选项 4 时,脚本将终止。

Creating a menu system and input prompts

显示启动画面或欢迎消息

除了列出用户可以选择的选项之外,使用Write-Output,您还可以显示一个启动画面或欢迎消息。华丽的启动画面可以给您的脚本留下良好的印象(专业和精细)。

请使用下面的代码替换您的myoutput.ps1文件中的代码,运行脚本时将输出一个启动画面(欢迎信息的横幅)。

您可以通过修改横幅的文本和格式来自定义启动画面。您可以根据需要添加额外的元素,如标志或文本,到启动画面中。

# 清屏
Clear-Host

# 使用Write-Output显示启动画面
Write-Output "##############################################"
Write-Output "#                                            #"
Write-Output "#   Welcome to the SuperScript 3000!         #"
Write-Output "#                                            #"
Write-Output "##############################################"

现在运行脚本,看看您的启动画面是什么样子的。

./myoutput.ps1
Displaying a splash screen or welcome message

显示进度条

当运行脚本时,进度指示器可以消除用户对脚本是否正在运行的不确定性。进度条可以用于向用户指示长时间运行的脚本或操作的进度。幸运的是,使用Write-Output cmdlet,您可以根据自己的喜好创建一个进度条。

打开您的myoutput.ps1文件,在脚本文件中的现有代码底部添加以下代码。

下面的代码使用while循环来迭代多个步骤。在这个例子中,有100个步骤。循环的每次迭代计算已完成的步骤的百分比,并使用Write-Output显示一个进度条。

进度条是使用以下运算符组合创建的:

  • * – 重复一个字符串指定的次数
  • $() – 允许将表达式的输出包含在字符串中。

然后脚本暂停(Start-Sleep)1秒钟以模拟进度,然后继续下一步。

# 设置进度条的总步数
$steps = 100

# 初始化当前步骤的计数器
$currentStep = 0

# 开始一个循环,将运行指定步数
while ($currentStep -lt $steps) {
  # 增加当前步骤的计数器
  $currentStep++

  # 计算完成步骤的百分比
  $percentComplete = [int] ($currentStep / $steps * 100)

  # 使用Write-Output显示进度条
  Write-Output "Progress: [$("=" * $percentComplete)$(" " * ($steps-$percentComplete))] $percentComplete% complete"

  # 暂停1秒钟以模拟进度
  Start-Sleep -Seconds 1
}

现在运行脚本,看看进度条如何工作。

./myoutput.ps1

下面,您可以看到闪屏以及进度条。

Displaying a progress bar

结论

在本教程中,您已经了解了如何使用Write-Output轻松输出对象、数据类型和自定义格式。此外,您还了解了使用管道运算符将输出发送到其他命令以进行进一步处理。

无论您是编写简单的消息输出还是复杂的自动化任务,Write-Output都是创建更具信息量和专业性的PowerShell脚本的不可或缺的工具。

有了这些新发现的知识,为什么不将您的输出写入不同的文件类型,比如.txt.xml文件呢?无论意图如何,输出副本在排查系统或应用程序问题时都非常方便。Write-OutputOut-File命令让您拥有您从未意识到需要的力量。

Source:
https://adamtheautomator.com/powershell-write-output/