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最基本的功能。但是,請繼續閱讀以了解更多中級到高級用法。<>

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命令的基本輸出格式,它運行正常。但如果您愿意,您也可以使用自定義格式輸出對象,以增加個人風格。當您希望顯示特定對象屬性或自定義輸出外觀時,自定義格式可能很有用。

要使用自定義格式輸出對象,可以使用Format-Custom命令與Write-Output命令,如下所示:

創建自定義輸出格式,然後將Format-Custom命令的輸出通過管道傳遞給Write-Output命令。<>

運行下面的命令,該命令不會產生輸出,但會創建一個對象(哈希表),其中包含三個屬性及其相應的值以進行輸出。

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

現在,執行以下命令執行以下操作:

  • 為你的 hashtable ($object) 創建一個自定義格式 (Format-Table) 用於輸出 (Write-Output)。 Property1Property2Property3 屬性被設置為列。
  • 調整列寬 (-AutoSize) 以適應內容。
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

或者,你可以使用 Format-List cmdlet 與 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 數組。
  • 計算通過管道傳遞的對象數 (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 cmdlet將對象視為單個實體,返回一個的計數(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 cmdlet的出色用途是使用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),以模擬進度,然後再繼續下一步驟。

# 設置進度條的總步驟數
$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/