パイプラインの概要Understanding pipelines

パイプラインは、複数の管を 1 つに継ぎ合わせた管路のような役割を果たします。Pipelines act like a series of connected segments of pipe. パイプラインに沿って移動する項目は、個々の管を通過します。Items moving along the pipeline pass through each segment. PowerShell でパイプラインを作成するには、パイプ演算子 (|) を使ってコマンドを接続します。To create a pipeline in PowerShell, you connect commands together with the pipe operator "|". 接続すると、各コマンドの出力が、次のコマンドの入力として使用されるようになります。The output of each command is used as input to the next command.

パイプラインで使用される表記は、他のシェルで使用される表記とほぼ同じです。The notation used for pipelines is similar to the notation used in other shells. PowerShell でのパイプラインの違いは、一目見ただけではわかりにくいかもしれません。At first glance, it may not be apparent how pipelines are different in PowerShell. 画面にはテキストが表示されますが、PowerShell は、コマンド間ではテキストではなくオブジェクトを受け渡します。Although you see text on the screen, PowerShell pipes objects, not text, between commands.

PowerShell のパイプラインThe PowerShell pipeline

パイプラインは、コマンドライン インターフェイスで使用される最も重要な概念と言っても過言ではありません。Pipelines are arguably the most valuable concept used in command-line interfaces. 適切に利用すれば、パイプラインによって複雑なコマンドを使用する負荷が軽減され、より簡単にコマンドのワークフローを確認できるようになります。When used properly, pipelines reduce the effort of using complex commands and make it easier to see the flow of work for the commands. パイプラインの各コマンド (パイプライン要素と呼ばれる) は、出力をパイプライン内の次のコマンドに項目単位で渡します。Each command in a pipeline (called a pipeline element) passes its output to the next command in the pipeline, item-by-item. コマンドでは、一度に複数の項目を処理する必要がなくなります。Commands don't have to handle more than one item at a time. 結果として、リソース使用量が低下すると共に、出力の取得をすぐに開始できるようになります。The result is reduced resource consumption and the ability to begin getting the output immediately.

たとえば、Out-Host コマンドレットを使用して、別のコマンドからの出力をページ単位で表示させると、通常のテキストがページごとに分割されて画面上に表示されているだけのように見えます。For example, if you use the Out-Host cmdlet to force a page-by-page display of output from another command, the output looks just like the normal text displayed on the screen, broken up into pages:

Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -Paging
    Directory: C:\WINDOWS\system32

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----        4/12/2018   2:15 AM                0409
d-----        5/13/2018  11:31 PM                1033
d-----        4/11/2018   4:38 PM                AdvancedInstallers
d-----        5/13/2018  11:13 PM                af-ZA
d-----        5/13/2018  11:13 PM                am-et
d-----        4/11/2018   4:38 PM                AppLocker
d-----        5/13/2018  11:31 PM                appmgmt
d-----        7/11/2018   2:05 AM                appraiser
d---s-        4/12/2018   2:20 AM                AppV
d-----        5/13/2018  11:10 PM                ar-SA
d-----        5/13/2018  11:13 PM                as-IN
d-----        8/14/2018   9:03 PM                az-Latn-AZ
d-----        5/13/2018  11:13 PM                be-BY
d-----        5/13/2018  11:10 PM                BestPractices
d-----        5/13/2018  11:10 PM                bg-BG
d-----        5/13/2018  11:13 PM                bn-BD
d-----        5/13/2018  11:13 PM                bn-IN
d-----        8/14/2018   9:03 PM                Boot
d-----        8/14/2018   9:03 PM                bs-Latn-BA
d-----        4/11/2018   4:38 PM                Bthprops
d-----        4/12/2018   2:19 AM                ca-ES
d-----        8/14/2018   9:03 PM                ca-ES-valencia
d-----        5/13/2018  10:46 PM                CatRoot
d-----        8/23/2018   5:07 PM                catroot2
<SPACE> next page; <CR> next line; Q quit
...

また、表示する完全なページが準備できると、Out-Host コマンドレットに処理が転送されるため、ページングによって CPU 使用率が低下します。Paging also reduces CPU utilization because processing transfers to the Out-Host cmdlet when it has a complete page ready to display. パイプライン内で先行するコマンドレットは、次のページの出力が利用可能になるまで、実行を一時停止します。The cmdlets that precede it in the pipeline pause execution until the next page of output is available.

Windows タスク マネージャーで次のコマンドを比較することにより、パイプによる CPU とメモリの使用量への影響を確認できます。You can see how piping impacts CPU and memory usage in the Windows Task Manager by comparing the following commands:

  • Get-ChildItem C:\Windows -Recurse
  • Get-ChildItem C:\Windows -Recurse | Out-Host -Paging

注意

Paging パラメーターは、すべての PowerShell ホストでサポートされているわけではありません。The Paging parameter is not supported by all PowerShell hosts. たとえば、PowerShell ISE で Paging パラメーターを使おうとすると、次のエラーが表示されます。For example, when you try to use the Paging parameter in the PowerShell ISE, you see the following error:

out-lineoutput : The method or operation is not implemented.
At line:1 char:1
+ Get-ChildItem C:\Windows -Recurse | Out-Host -Paging
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [out-lineoutput], NotImplementedException
    + FullyQualifiedErrorId : System.NotImplementedException,Microsoft.PowerShell.Commands.OutLineOutputCommand

パイプライン内のオブジェクトObjects in the pipeline

PowerShell でコマンドレットを実行した場合、コンソール ウィンドウではオブジェクトをテキストで表す必要があるため、テキストが表示されます。When you run a cmdlet in PowerShell, you see text output because it is necessary to represent objects as text in a console window. テキスト出力では、出力されるオブジェクトのすべてのプロパティが必ず表示されるわけではありません。The text output may not display all of the properties of the object being output.

たとえば、Get-Location コマンドレットについて考えてみます。For example, consider the Get-Location cmdlet. 現在の場所が C ドライブのルートである場合に Get-Location を実行すると、次のような出力が表示されます。If you run Get-Location while your current location is the root of the C drive, you see the following output:

PS> Get-Location

Path
----
C:\

テキストの出力は情報の要約であり、Get-Location から返されたオブジェクトの完全な表現ではありません。The text output is a summary of information, not a complete representation of the object returned by Get-Location. 出力の見出しは、画面の表示用にデータを書式設定する処理によって、追加されます。The heading in the output is added by the process that formats the data for onscreen display.

出力を Get-Member コマンドレットにパイプ処理するときに、Get-Location から返されたオブジェクトに関する情報を取得します。When you pipe the output to the Get-Member cmdlet you get information about the object returned by Get-Location.

Get-Location | Get-Member
   TypeName: System.Management.Automation.PathInfo

Name         MemberType Definition
----         ---------- ----------
Equals       Method     bool Equals(System.Object obj)
GetHashCode  Method     int GetHashCode()
GetType      Method     type GetType()
ToString     Method     string ToString()
Drive        Property   System.Management.Automation.PSDriveInfo Drive {get;}
Path         Property   string Path {get;}
Provider     Property   System.Management.Automation.ProviderInfo Provider {get;}
ProviderPath Property   string ProviderPath {get;}

Get-Location は、現在のパスとその他の情報を含む PathInfo オブジェクトを返します。Get-Location returns a PathInfo object that contains the current path and other information.