さようなら、予測可能なスクリプト出力!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
コマンドレットの最も基本的な機能が見られます。ただし、詳細な使用法から高度な使用法まで学ぶには続けて読んでください。<>
別のコマンドにオブジェクトを渡すコンソールに出力するだけでなく、Write-Output
コマンドを使用してオブジェクトを別のコマンドに送信してさらなる処理を行うことができます。 どうやって? パイプライン演算子(|
)を使用します。
資源の大部分を消費しているプロセスを見たいとします、たとえばCPU。
以下のコマンドを実行して次の操作を行います:
- システムで実行中のすべてのプロセス(
Get-Process
)のリストを取得します。 - リストをパイプラインに出力し、
Sort-Object
コマンドに渡します。パイプライン演算子を使用すると、複数のコマンドを連結して、1つのコマンドの出力を別のコマンドの入力として処理することができます。 - プロセスのリストを
Sort-Object
コマンドでCPU
使用率の降順に並べ替えます。
このチュートリアルのいずれのコマンドでも、PowerShellスクリプトに配置して実行することができます。
並べ替えられたリストは、以下に示すようにコンソールに表示されます。

カスタムフォーマットでオブジェクトを出力する
基本的な出力形式であるWrite-Outputコマンドレットは正常に機能しますが、必要に応じてパーソナルなタッチを加えるためにカスタムフォーマットでオブジェクトを出力することもできます。カスタムフォーマットは、特定のオブジェクトのプロパティを表示したり、出力の外観をカスタマイズしたりする場合に便利です。
カスタムフォーマットでオブジェクトを出力するには、Format-CustomコマンドレットとWrite-Outputコマンドレットを組み合わせることで実現できます。次のようになります:
カスタム出力形式を作成し、その後、Format-Customコマンドレットの出力をWrite-Outputにパイプします。<>
出力は生成されず、出力するために3つのプロパティとそれに対応する値を含むオブジェクト(ハッシュテーブル)を作成します。
以下のコマンドを実行して、次の操作を実行します:
- ハッシュテーブル (
$object
) の出力 (Write-Output
) のカスタムフォーマット (Format-Table
) を作成します。Property1
、Property2
、およびProperty3
プロパティが列として設定されます。 - 列の幅 (
-AutoSize
) をコンテンツに合わせて調整します。

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

コレクションオブジェクトを単一のエンティティとして渡す
Write-Output
はデフォルトで、コレクションの各要素を別々にパイプラインを介して送信します。これを列挙と呼びます。ただし、-NoEnumerate
パラメータを追加することで、この動作を防ぐことができます。これにより、コレクションオブジェクト全体が単一のエンティティとして渡されます。
-NoEnumerate
パラメータがどのように機能するかを確認するには、次の手順に従ってください:
以下のコマンドを実行して、次の操作を実行します:
1,2,3
の配列$numbers
を宣言します。
- パイプラインを介して渡されるオブジェクトの数 (
Measure-Object
) をカウントします。 - オブジェクトの計測値を出力します(
Write-Output $numbers
)。
NoEnumerate
パラメーターを使用しない場合、Measure-Object
は各要素が列挙され、個別にパイプラインを通過したため、3つのカウントが返されます(3)。

次に、以下のコマンドを実行してパイプラインを通過したオブジェクトのカウントを出力します。
ただし、-NoEnumerate
パラメーターを追加したため、Measure-Object
コマンドレットはオブジェクトを単一のエンティティとして扱い、1つのカウントが返されます(1)。

Write-Output
コマンドを括弧で囲む(つまり、(Write-Output 1,2,3)
)と、-NoEnumerate
パラメーターに関係なく列挙が強制されます。
メニューシステムと入力プロンプトの作成
Write-Output
コマンドレットのもう一つの優れた使用例は、PowerShellスクリプトでユーザーに入力を促すメニューシステムを作成することです。
お好みのテキスト/コードエディタで.ps1ファイルを作成し、以下のコードを入力してファイルを保存します。ファイル名は任意ですが、このチュートリアルではmyoutput.ps1とします。
以下のコードは、ユーザーにオプションのリストから選択するように繰り返しプロンプトを表示し、ユーザーがExit
オプションを選択するまで続けます。
スクリプト(myoutput.ps1
)を作業ディレクトリから実行します。
以下に示されているように、オプション1、2、または3を選択した場合、選択に関連付けられたメッセージが表示されます。ただし、オプション4を選択すると、スクリプトが終了します。

スプラッシュスクリーンまたはウェルカムメッセージの表示
ユーザーが選択できるオプションをリストアップするだけでなく、Write-Output
を使用してスプラッシュスクリーンやウェルカムメッセージも表示できます。洗練されたスプラッシュスクリーンは、スクリプトを実行する際にプロフェッショナルで洗練された印象を与えます。
次のコードで、スクリプトを実行するとスプラッシュスクリーン(ウェルカムメッセージのバナー)が表示されるように、myoutput.ps1 ファイルのコードを置き換えてください。
テキストやバナーのフォーマットを変更してスプラッシュスクリーンをカスタマイズできます。必要に応じてロゴやテキストなどの追加要素をスプラッシュスクリーンに追加できます。
スクリプトを実行してスプラッシュスクリーンがどのように表示されるか確認してください。

プログレスバーの表示
スクリプトを実行する際、進捗インジケーターはユーザーの不安を解消します。Write-Output
コマンドレットを使用して、好みに合わせたプログレスバーを作成できます。
myoutput.ps1 ファイルを開き、既存のスクリプトファイルの最後に以下のコードを追加してください。
以下のコードは、while
ループを使用していくつかのステップを繰り返します。この例では、100ステップです。ループの各繰り返しで完了したステップのパーセンテージを計算し、Write-Output
を使用してプログレスバーを表示します。
プログレスバーは、次の演算子の組み合わせを使用して作成されます:
*
– 指定された回数の文字列を繰り返します。$()
– 式の出力を文字列に含めることを許可します。
その後、スクリプトは次のステップに進む前に、進行をシミュレートするために Start-Sleep
を使用して 1
秒間一時停止します。
スクリプトを実行して、進行状況バーがどのように機能するかを確認してください。
以下に、進行状況バーとスプラッシュスクリーンが表示されます。

結論
このチュートリアルでは、Write-Output
がオブジェクト、データ型、およびカスタム形式を簡単に出力できる方法を見てきました。さらに、出力を他のコマンドに送信してさらなる処理を行うためのパイプライン演算子の使用に触れました。
`Write-Output`は、シンプルなメッセージ出力から複雑な自動化タスクまで、より情報豊かでプロフェッショナルなPowerShellスクリプトを作成するための不可欠なツールです。
この新たな知識を活用して、なぜさまざまなファイルタイプ(.txtや.xmlなど)に出力を書き込まないのでしょうか?目的に関係なく、出力のコピーは、システムやアプリケーションのトラブルシューティングで便利です。`Write-Output`と`Out-File`コマンドレットは、必要とは思わなかったパワーを与えてくれます。
Source:
https://adamtheautomator.com/powershell-write-output/