PowerShell Write-Output:あなたの友達の出力コンパニオン

さようなら、予測可能なスクリプト出力!PowerShellのWrite-Outputコマンドレットを使用すると、PowerShellスクリプトに創造性と個性を加えることができます。

Write-Outputコマンドレットは強力なツールであり、すべての自動化およびシステム管理ニーズに最適な相棒です。そして、このチュートリアルでは、Write-Outputコマンドレットの潜在能力を最大限に活用する方法を学びます。

準備はいいですか?続けて読んで、Write-Outputコマンドレットの魔法を発見してください!

前提条件

このチュートリアルは実演形式です。一緒に進めるためには、PowerShellがインストールされたコンピューター(できれば最新バージョン)が必要です。このチュートリアルでは、PowerShell 7がインストールされたWindows 10を使用します。

コンソールにオブジェクトを出力する

PowerShellのWrite-Outputコマンドレットは、オブジェクトを出力ストリームに書き込み、コマンドまたはメッセージの出力をコンソールに表示します。しかし、このツールが出力をより意味のあるものに、そしてより価値のあるものに変える方法には驚くでしょう。

代わりに、コンソールに出力する代わりに、Write-Output コマンドレットを使用して出力をカスタマイズします。 Write-Output コマンドレットは、文字列、整数、配列、さらには複雑なオブジェクトなど、任意のオブジェクトまたはデータ型を出力できます。

以下のコマンドを実行して、コンソールにHello, World! メッセージを出力します。

Write-Output "Hello, World!”
Outputting objects to the console

Write-Output コマンドレットの最も基本的な機能が見られます。ただし、詳細な使用法から高度な使用法まで学ぶには続けて読んでください。<>

別のコマンドにオブジェクトを渡すコンソールに出力するだけでなく、Write-Output コマンドを使用してオブジェクトを別のコマンドに送信してさらなる処理を行うことができます。 どうやって? パイプライン演算子(|)を使用します。

資源の大部分を消費しているプロセスを見たいとします、たとえばCPU。

以下のコマンドを実行して次の操作を行います:

  • システムで実行中のすべてのプロセス(Get-Process)のリストを取得します。
  • リストをパイプラインに出力し、Sort-Objectコマンドに渡します。パイプライン演算子を使用すると、複数のコマンドを連結して、1つのコマンドの出力を別のコマンドの入力として処理することができます。
  • プロセスのリストをSort-ObjectコマンドでCPU使用率の降順に並べ替えます。
$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にパイプします。<>

出力は生成されず、出力するために3つのプロパティとそれに対応する値を含むオブジェクト(ハッシュテーブル)を作成します。

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

以下のコマンドを実行して、次の操作を実行します:

  • ハッシュテーブル ($object) の出力 (Write-Output) のカスタムフォーマット (Format-Table) を作成します。 Property1Property2、および Property3 プロパティが列として設定されます。
  • 列の幅 (-AutoSize) をコンテンツに合わせて調整します。
$object | Format-Table -Property Property1, Property2, Property3 -AutoSize | Write-Output
Creating a custom format for an object output

または、Format-List コマンドレットを使用して、オブジェクトをプロパティ値のペアのリストとして出力することもできます。

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

コレクションオブジェクトを単一のエンティティとして渡す

Write-Output はデフォルトで、コレクションの各要素を別々にパイプラインを介して送信します。これを列挙と呼びます。ただし、-NoEnumerate パラメータを追加することで、この動作を防ぐことができます。これにより、コレクションオブジェクト全体が単一のエンティティとして渡されます。

-NoEnumerate パラメータがどのように機能するかを確認するには、次の手順に従ってください:

以下のコマンドを実行して、次の操作を実行します:

  • 1,2,3 の配列 $numbers を宣言します。
  • パイプラインを介して渡されるオブジェクトの数 (Measure-Object) をカウントします。
  • オブジェクトの計測値を出力します(Write-Output $numbers)。

NoEnumerateパラメーターを使用しない場合、Measure-Objectは各要素が列挙され、個別にパイプラインを通過したため、3つのカウントが返されます(3)。

# 配列を宣言します
$numbers = 1,2,3
# パイプラインを通過したオブジェクトのカウントを出力します
Write-Output $numbers | Measure-Object
Outputting an array object measurement

次に、以下のコマンドを実行してパイプラインを通過したオブジェクトのカウントを出力します。

ただし、-NoEnumerateパラメーターを追加したため、Measure-Objectコマンドレットはオブジェクトを単一のエンティティとして扱い、1つのカウントが返されます(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オプションを選択するまで続けます。

# $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 ($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

以下に示されているように、オプション12、または3を選択した場合、選択に関連付けられたメッセージが表示されます。ただし、オプション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 コマンドレットを使用して、好みに合わせたプログレスバーを作成できます。

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-Output`と`Out-File`コマンドレットは、必要とは思わなかったパワーを与えてくれます。

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