1. ホーム
  2. スクリプト・コラム
  3. パワーシェル

PowerShellパイプラインチュートリアル(パイプラインの例)

2022-02-07 03:46:50

PowerShellの最も重要な機能の1つにパイプラインがあります。この記事では、パイプラインの使い方と例を最初から最後まで解説します。すべてのPowerShellユーザーと技術ベテランに適しています。さらに、技術専門家との議論や学習も歓迎します。

1. パイプラインとは何ですか?

シェルにおける重要な基本概念は、パイプラインです。パイプラインでは、一連のコマンドの出力が次のコマンドの入力パラメータになります。パイプラインの概念は、より現実の生産ラインに近いものです。次の例のように、生産のさまざまな段階で連続的に再処理を行うのです。

"Get-ChildItem" は、現在のパス内のすべてのアイテムを取得することを意味します。 "|Where-Object {$_.Length -gt 200}" は、前のステップの結果を表示し、Length -gt 200 よりも長いアイテムをすべて取ることを意味します。 "|Sort-Object -Descending Name" は、前のステップの結果を名前で逆順に並べて表示することを意味します。

PowerShellの場合 は、PowerShell ではパイプ記号 (|) を使用します。 ) を使ってパイプ内の各コマンドを区切っています。上記の例ではパイプの威力を説明していますが、PowerShellの パイプラインでは、テキストの説明だけでなく、高忠実度のオブジェクトが渡されます。

一般的なパイプライン処理コマンドを簡単に紹介します。

2. Where - オブジェクト。フィルタリスト項目またはコマンド出力結果

Where-Object(エイリアスは where と ?)を使用すると、リストやコマンド出力から必要な項目をフィルタリングして選択することができます。

Where-Objectは、入力の各項目について、{}で定義されたスクリプトブロックに基づいて計算し、それがTrueを返した場合は出力し、そうでない場合は出力しません。次の例では

{は一連のPowerShellコマンドを入力できるスクリプトブロックを表し、$_は現在の入力オブジェクトを表し、この場合、$_はファイルアイテムを表します。-gt は比較演算子で、より大きいという意味です。

PowerShellの比較演算子は、式の比較に使用されます。デフォルトでは比較演算子は大文字小文字を区別しません。大文字小文字を区別したい場合は-C接頭辞を、区別する必要がない場合は-I接頭辞を用います。

利用可能なすべての比較演算子を以下に表で示します。

<テーブル

演算子

意味

Trueを返す例

-eq

等価文字

10 -eq 10

-ネ

不等号文字

10 -ne 9

-年齢

大なり小なり演算子

10 -ge 9

-gt

大なり演算子

10 -gt 9

-lt

小なり演算子

10 -lt 11

-ル

小項目演算子

10 -le 11

-的な

類似性演算子

Bob" -quot;*ob"のようなものです。

-嫌い

ノンライク演算子

"Bob" -notlike "1*ob"

-マッチ

マッチ演算子

Bob" -match "B*ob"

-ノットマッチ

非対応演算子

"Bob" -notmatch "123*"

-を含む

演算子を含む

Bob","Bob1" -Bob"を含んでいます。

-非含有

非含有演算子

Bob","Bob1" -notcontains"ob".を含む。

-は

型演算子

"Bob" -は "System.String"

-ではない

未定義演算子

Bob" は、System.Int32" ではありません。

3. ForEach-Object。リストまたはコマンド出力の各項目を処理する

リストの各項目を処理するには、ForEach-Objectコマンド(エイリアスはforeachと%)を使用します。

使用例は以下の通りです。

例題の1..10は、単純に1から10までの数字の集合を宣言することを意味します。リストの各項目の処理は、後で詳しく説明するfor, foreach, do, whileでも行うことができます。

4. Select-Object:リスト項目を選択するか、必要な結果のみを出力する

Select-Object(別名select)オブジェクトは、オブジェクトまたはオブジェクトグループの指定されたプロパティを選択するために使用されます。また、オブジェクトの配列から一意のオブジェクトを選択したり、オブジェクトの配列の先頭または末尾から指定された数のオブジェクトを選択したりすることも可能です。

Select-Object を使って指定したプロパティを選択すると、入力オブジェクトからそれらのプロパティの値をコピーし、指定したプロパティとコピーされた値を持つ新しいオブジェクトを作成します。選択したいプロパティを指定するには、Propertyパラメータを使用します。また、First、Last、Unique、Skip、Index パラメータを使用して、入力オブジェクトの配列から特定のオブジェクトを選択することもできます。

使用例は以下の通りです。

a) 現在のパス内のすべてのアイテムのNameとLength属性を選択します。

b) 現在のパスの下にある最初の3つの項目を選択します。

c) 現在のパスの下にあるすべてのアイテムの名前とカスタム属性を選択し、名前は最終更新日、結果はLastWriteTime属性から次のように計算されます。

d) 現在のパスの1番目と6番目の項目を選択します。

e) 現在のパスの中で5番目の項目を除くすべての項目を選択する。

f) 配列に一意な番号を表示する。

5. Sort-Object。リストアイテムまたは出力のソート

特定のプロパティ値でオブジェクトを並べ替えるには、Sort-Object(別名sort)を使用します。1つの属性または複数の属性(マルチキーソート)を指定することができ、大文字と小文字を区別してソートすることもできます。また、特定のプロパティに一意の値を持つオブジェクトのみを表示するよう、Sort-Object に指示することもできます。

オブジェクトが指定された属性のいずれかを持たない場合、コマンドレットはそのオブジェクトの属性値をNULLとして解釈し、ソート順の最後に配置します。

使用例は以下の通りです。

a) 現在のパスの下にあるすべての項目を、小さいものから大きいものへと長さで並べ替える。

b) 一意な番号の配列全体を降順にソートする。

6. Tee-Objectです。リスト項目の保存と出力、または結果の出力

Tee-Object(通称tee)コマンドを使用して、コマンドの出力をファイルまたは変数に保存し、コンソールに表示することができます。

a) 現在のパスの中で900より大きいものをすべてファイルに保存し、コンソールに表示します。

b) 現在のパスの下にある900より大きなサイズのアイテムをすべて変数に保存し、コンソールに表示する。

7. Group-Object。リストアイテムや出力結果のグループ化

group-Object(group)を使って、同じ値を持つグループオブジェクトを含む属性を指定して、リスト項目や出力をグループ化します。group-Objectは、各属性値が行に対応し、その値を持つ項目の数を示す列を持つ表を返します。

また、-AsHashTable パラメータを指定すると、返されるオブジェクトを HashTable (キーと値のペアの配列) にすることも可能である。

8. Measure-Object(メジャーオブジェクト)。リスト項目または出力結果の計算

Measure-Object (メジャー) は、オブジェクトの数値的特性や、テキスト ファイルなどの文字列オブジェクトの文字数、単語数、行数を計算するために使用します。measure-Objectは、コマンドのパラメータによって、3種類の計測を実行します。オブジェクトを数えたり、数値の最小値、最大値、合計値、平均値を計算することができます。テキストオブジェクトの場合、行数、単語数、文字数を数え、計算します。

a) 現在のパスの下にあるアイテムの総数を数える。

b) 現在のパス内のアイテムの長さの最小値、最大値、平均値を計算する。

c) 現在のファイルの文字数、行数、単語数の合計を計算する。

9. コンペア・オブジェクト 2つのオブジェクトのセットを比較する

Compare-Object(別名 compare および diff)を使用すると、2 つのオブジェクト グループを比較できます。1 つのオブジェクト グループを参照グループ、もう 1 つのオブジェクト グループを差分グループとします。比較の結果、プロパティ値が参照グループのオブジェクトにのみ現れるか(<= 記号で示される)、差分グループのオブジェクトにのみ現れるか(=> 記号で示される)、または(IncludeEqual パラメータが指定されている場合)両方のオブジェクトに現れるか(== 記号で示される)が示されることになる。

10. ConvertTo-Html: オブジェクトをHTMLに変換する

ConvertTo-Html を使用すると、Microsoft.Net Framework オブジェクトを Web ブラウザで表示可能な HTML に変換できます。

11. Export-Csv: オブジェクトを CSV 文字列に変換してファイルに保存する

Export-Csv(別名epcsv)を使用して、Microsoft .NET Frameworkオブジェクトを一連のカンマ区切りの可変長(CSV)文字列に変換し、これらの文字列をCSVファイルに保存します。

12. Format-List、Format-Table、Format-Wide:出力の書式設定

Format-List (alias fl) は、出力を属性のリストとしてフォーマットし、各属性は別々の行に表示されます。

Format-Table(エイリアスはft)は、出力を表としてフォーマットすることができます。

Format-Wide (別名 fw) は、オブジェクトをフォーマットして、オブジェクトごとに1つの属性だけの広いテーブルを表示することができます: 。

13. Get-Unique(ゲット・ユニック)。出力の一意な値を取得する

ソートされたリストからユニークなアイテムを返すには Get-Unique (エイリアスは gu) を使用します。

14. Out-File: 出力をファイルに出力する

でOut-Fileを使用してファイルに出力することができます。

15. Get-Member:パイプラインオペレーションオブジェクトのプロパティを取得する方法

パイプライン入力オブジェクトのプロパティは、パイプライン操作中によく使用されます。オブジェクトのプロパティとメソッドを取得するには、Get-Member (gm) を使用します。

a) オブジェクトのパブリックプロパティを取得する。

b) オブジェクトのパブリックメソッドを取得します。

オブジェクトのパブリックプロパティとメソッドの名前が分かれば、パイプライン操作で使えるようになります。

16. コマンドがパイプライン入力をサポートしているかどうかを判断する方法

パイプの使い方を覚えたら、コマンドがパイプ入力をサポートしているかどうかを判断することも覚えなければなりません。コマンドの使い方や引数について、パイプ入力をサポートしているかどうかを調べるには、Get-Helpコマンドを使用するか、MSDNでコマンドのヘルプを調べます。

例えば、PowerShell Core 内の Where-Object の MSDN ヘルプサイトは以下の通りです。

https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.core/Where-Object。

パイプライン入力をサポートする内側の -InputObject と、そうでない側の -Is について: 。

例えば、PowerShell Core 内の Move-Item に関する MSDN のヘルプサイトは以下の通りです。

https://msdn.microsoft.com/powershell/reference/5.1/microsoft.powershell.management/Move-Item。

パイプライン入力をサポートする内側の -Path と、そうでない側の -UseTransaction について:.

引数のいずれについてもパイプライン入力をサポートしないコマンドは、パイプライン入力をサポートしないコマンドです。

17. データ集約型タスクの自動化

大量のデータを処理する簡単な作業であれば、データをCSVファイル内に保存し、Import-Csvでデータをインポートし、インポート後に各行に対して自動的にオブジェクトを作成し、列名をオブジェクトのプロパティとして使用し、後でforeachを使ってデータの各項目に処理を行うことができます。

PowerShell では、名前付き CSV ファイルの列の名前がパイプラインで使用されるパラメータの名前と一致する場合、この部分的または完全なパラメータ マッピングを実装することができます。

PowerShellの大きな利点の1つは、繰り返し作業を自動化できることです。これらの繰り返しタスクは、アクションが多く(システムメンテナンス、レジストリの操作、ファイルのクリーンアップなど)、互いに複雑な連続したコマンドの呼び出しが含まれることもあります。このような場合、スクリプトを書くことでこれらの操作をまとめて行うことができ、時間の節約やエラーの発生を抑えることができます。

上記のリストは、よく使われるコマンドとその使い方に過ぎず、PowerShellの強力なコマンド群はそれだけに留まらない。

上記の記事は、PowerShellのパイプラインを始めるにあたって必見の内容(パイプライン例の完全リスト)ばかりをお伝えしています。