【PowerShellを始める】その6)パイプラインとリダイレクション

1 はじめに

【初めてのPowerShell】第7回目は、
PowerShellパイプライン(Pipeline)とリダイレクション(Redirection)についてです。

本記事では、
WindowsコマンドプロンプトやUnixのBashパイプラインリダイレクションと違うことを
中心に記述していきます。

PowerShellって、従来のWindowsコマンドプロンプトやLinuxなどUNIX系のBashなどと
比べるとどうも難しい。

とにかく、コマンドレット(cmdlet)やオブジェクト(object)っていうのが、 よくわからない。
訳のわからない演算子もたくさんでてくる。
関数も、訳のわからない属性設定がいっぱいある。

それじゃー、わかるところを始めようとしたのは、この【PowerShellを始める】シリーズです。
本シリーズは、PowerShellにどのような要素があるのかをまとめただけであり、
実際にPowerShellを利用する際のインデックスであることを目的に構成しました。

【PowerShellを始める】シリーズの全容は、
最終章(4章 【PowerShellを始める】全容)に示します。
よければ、ご覧ください。

PowerShell個別の問題については、適宜記事にしていきたいと思っています。

2 パイプライン

パイプラインは、パイプライン演算子)によって接続される一連のコマンドです。
パイプライン演算子は、前のコマンドの結果を次のコマンドに送信します。

複数のコマンドを組み合わせて、データを効率的に処理することができるようになります。

パイプラインの詳細については、次のページをご覧ください。
about_Pipelines | Learn / PowerShell

Command-1 | Command-2 | Command-3

2.1 パイプラインの基本

最初のコマンドの出力は、2番目のコマンドへの入力として処理するために送信できます。
その出力は、さらに別のコマンドに送信できます。

その結果、一連の単純なコマンドで構成される複雑なコマンドチェーン
またはPipelineになります。

下に単純な例を示します。
下のコマンドは、メモ帳プロセスを取得し、停止します。

PS> Get-Process notepad | Stop-Process

最初のコマンドGet-Processコマンドレットを使用してメモ帳プロセスを表すオブジェクトを
取得します。

パイプライン演算子)を使用して、
プロセスオブジェクトをStop-Processコマンドレットに送信し、メモ帳プロセスを停止します。

2.2 パラメーターバインディング

PowerShellのパイプラインが、WindowsコマンドプロンプトやUnixのBash
決定的に違うのは、StdInがないため、(StdOut->Stdin)というな流れで
次のコマンドにつなげられないということです。

PowerShellでは、代わりにパイプラインのパラメーターバインディングと呼ばれる仕組みを
使って、オブジェクトをつなげます。

パラメーターバインディング(Pipeline parameter binding)は、
PowerShellのパイプラインにおけるコマンドレットや関数に引数を渡す際の重要な機能です。

コマンドレットのパラメーターは、 次の2つの方法のいずれかでパイプライン入力を受け入れます。

2.2.1 ByValueの例

パラメーターは、
予想される.NET型に一致する値、またはその型に変換できる値を受け取ります。

PS> Get-Content names.txt | Set-Content output.txt

この例では、次に示す流れで、型が一致するためByValueでバインドされます。

Get-Contentは、文字列の配列を出力
Set-Contentは、string[]型の”-InputObject”を受け取る

2.2.2 ByPropertyNameの例

パラメーターは、入力オブジェクトにパラメーターと同じ名前のプロパティがある場合にのみ
入力を受け入れます。

この例では、次に示す流れで、ByPropertyNameでバインドされます。

Restart-Computerは、”ComputerName”パラメーターを受け取る
$dataに”ComputerName”プロパティがある

2.3 パイプライン入力を受け入れるパラメーター

パイプライン処理をサポートするには、
受信コマンドレットにパイプライン入力を受け入れるパラメーターが必要です。

Get-Helpコマンドを ”-Full”または”-Parameter”オプションと共に使用して、
パイプライン入力を受け入れるコマンドレットのパラメーターを確認することができます。

たとえば、パイプライン入力を受け入れるStart-Serviceコマンドレットの
パラメーターを決定するには、

PS> Get-Help Start-Service -Full
 
# または
PS> Get-Help Start-Service -Parameter *

Start-Serviceコマンドレットのヘルプから、パイプライン入力を受け入れるのは、
Accept pipeline input?”がTrueになっている
InputObject”パラメーターと”Name”パラメーターだけであることがわかります。

2.4 ネイティブコマンドとのパイプライン

PowerShellでは、ネイティブ外部コマンドをパイプラインに含めることができます。

ただし、PowerShell のパイプラインはオブジェクト指向であり、
生バイトデータをサポートしていない点に注意することが重要です。

3 リダイレクション

リダイレクション(Redirection)は、
コマンドの出力をファイルに保存したり、他のコマンドに渡したりするための強力な機能です。

既定では、PowerShellは出力をPowerShellホストに送信します。
通常、これはコンソールアプリケーションです。

出力をテキストファイルにリダイレクトしたり、
エラー出力を通常の出力ストリームにリダイレクトしたりすることができます。

リダイレクションの詳細については、次のページ参照してください。
about_Redirection | Learn / PowerShell

3.1 出力のリダイレクト

リダイレクトは、PowerShellリダイレクト演算子を使用します。

リダイレクト演算子)を使用したPowerShellコマンド (コマンドレット、関数、スクリプト)
の出力のリダイレクトは、
追加のパラメーターを使用しない Out-Fileへのパイプ処理と機能的に同等です。

この例では、すべての成功ストリーム データを”script.log”というファイルに送信します。

PS> .\script.ps1 > script.log

下に示す例では、望ましい結果を得るためのリダイレクト演算子の組み合わせ方法を 示しています。

3>&1”は、警告ストリームを成功ストリームにリダイレクトします。

2>&1”は、エラーストリームを成功ストリームにリダイレクトします
(警告ストリームのデータもすべて含まれるようになります)。

>”は、成功ストリーム(警告ストリームとエラー ストリームの両方を含む)を
C:¥temp¥redirection.log”というファイルにリダイレクトします。

3.2 リダイレクト可能な出力ストリーム

PowerShellは、コマンドプロンプト、Bashなどのような標準出力標準エラー出力だけでなく、
表3.2-1に示す出力ストリームのリダイレクトをサポートしています。

3.3 PowerShell リダイレクト演算子

PowerShellリダイレクト演算子を、 表3.3-1に示します。

構文の”n”は、ストリームNo.を表します。
成功ストリーム(1)は、ストリームが指定されていない場合の既定値です。

3.4 ネイティブ コマンドからのリダイレクト出力

7.4以降のPowerShellは、
ネイティブコマンドのstdoutストリームをファイルにリダイレクトするとき、
またはバイトストリームデータをネイティブコマンドのstdinストリームにパイプするときに、
バイトストリームデータを保持できます。

下に示す例のように、ネイティブコマンド”curl”でバイナリファイルをダウンロードし、
それをファイルにリダイレクトを保存することができるようになりました。

PS> $uri = 'https://github.com/PowerShell/PowerShell/releases/download/v7.3.7/powershell-7.3.7-linux-arm64.tar.gz'
 
# native command redirected to a file
PS> curl -s -L $uri > powershell.tar.gz

バイトストリームデータは、
別のネイティブ コマンドのstdinストリームにパイプすることもできます。

次の例では、curlを使用してzip 形式のTARファイルをダウンロードしています。
ダウンロードしたファイルデータは、 ”tar”コマンドにストリーミングされ、 アーカイブの内容が抽出されます。

# native command output piped to a native command
PS> curl -s -L $uri | tar -xzvf - -C .

以上

本記事の元となっているWordで作成したPDFを
ページ最後に貼り付けました。

少しでも役に立てていただければ、うれしく思います。

このPDFファイルは、自由に配布されてもかまいません。
ただし、再配布の際には、
入手元著者名は明らかにしてください

なお、上のPDFファイルの内容、また本文中の記述に、
誤字や脱字、誤った内容の記述など見つかりましたら、
下に示すフォームでご連絡いただければ幸いです。

お問い合わせ