Windows Powershell使用配管

4019 ワード

パイプは新しいものではありません.以前のCmdコンソールにもリダイレクトコマンドがありました.例えば、Dir|Moreは結果をスクリーンに表示することができます.従来のCmdパイプはテキストベースですが、Powershellはオブジェクトベースです.

PS> ls | Sort-Object -Descending Name | Select-Object Name,Length,LastWriteTime | ConvertTo-Html | Out-File ls.html

PS> Get-Content .ls.html


Name Length LastWriteTime
test.vbs 170 2011/11/28 16:42:03
test.txt 242 2011/11/23 17:37:37
test.ps1 140 2011/12/2 18:47:35
psdrive.html 2556 2011/11/30 16:04:00
Powershell_Cmdlets.html 735892 2011/11/24 17:44:37
ping.bat 63 2011/11/28 15:30:04
name.html 7420 2011/11/24 17:37:28
myscript 2011/11/29 18:21:28
ls.html 434 2011/12/14 11:22:30
LogoTestConfig.xml 186 2011/11/28 11:12:08
function.ps1 21466 2011/11/29 19:23:58
employee.xml 556 2011/11/25 11:20:33
d.txt 0 2011/11/23 17:25:23
c.txt 0 2011/11/23 17:25:23
b.txt 0 2011/11/23 17:25:23
alias.ps1 12060 2011/11/24 20:27:24
alias 12060 2011/11/24 20:26:36
ABC 2011/11/23 17:25:53
a.txt 26384 2011/11/24 20:04:31
a.html 67580 2011/11/24 18:30:13

まず、現在のディレクトリの下にあるディレクトリとファイルをリストし、ファイル名の降順に並べてから、ファイル名、ファイルサイズ、ファイルの変更時間を投影し、Html形式に変換し、現在のディレクトリのlsに出力.html
オブジェクト向けパイプ
上記の例はオブジェクト向けのパイプに属し、パイプが出力コマンドで終了しない限り、各コマンドの最後に新しいコマンドを使用して前のコマンドの結果をさらに処理できます.Sort-objectのように、ファイルのリストをソートするには、ソートされたキーワードを昇順か降順かを教える必要があります.lsの戻り値は配列であり、配列内の各要素はオブジェクトであり、オブジェクトの各属性はSort-objectのソートキーとすることができる.ただし、Powershellが渡すオブジェクトには多くのプロパティがある可能性があるため、ソート時に特定のキーワードを指定する必要があります.通常のテキストとは異なり、オブジェクトの情報は構造化されているため、Powershellのパイプがより強く便利になります.
変換コマンドの実行結果はテキスト
Powershellコマンドを実行すると、解釈器はデフォルトでコマンドの最後にパイプコマンド、Out-Defaultを追加します.これにより、元のオブジェクトの結果をコンソールにテキストで表示することができますが、結果を変換することはありません.そのため、他のパイプを使用してオブジェクトの結果を操作し続けることができます.しかし、ConvertTo-HTmlのようなコマンドを使用すると、結果は固定形式の純粋なテキストに変換されます.
パイプの結果をさらに処理するコマンドは、次のとおりです.
Compare-Object:2つのオブジェクトのグループを比較します.ConvertTo-HTml:Microsoft.NET Frameworkオブジェクトは、Webブラウザに表示できるHTMLに変換されます.Export-Clixml:オブジェクトのXMLベースの表示形式を作成し、ファイルに保存します.Export-Csv:Microsoft.NET Frameworkオブジェクトは、カンマで区切られた長さ可変(CSV)文字列の一連に変換され、これらの文字列をCSVファイルに保存します.ForEach-object:入力オブジェクトのセットごとに操作を行います.Format-List:出力のフォーマットを属性リストに設定し、各属性が1行ずつ表示されます.Format-Table:出力のフォーマットをテーブルに設定します.Format-Wide:オブジェクトのフォーマットを、各オブジェクトの1つのプロパティしか表示できないワイドテーブルに設定します.Get-Unique:ソートリストから一意のアイテムを返します.Group-Object:指定した属性に同じ値のグループオブジェクトが含まれます.Import-Clixml:CLIXMLファイルをインポートし、Windows PowerShellに適切なオブジェクトを作成します.Measure-Object:計算対象の数値属性および文字列オブジェクト(テキストファイルなど)の文字数、単語数、行数.more:結果を画面分割表示.Out-File:出力をファイルに送信する.Out-Null:出力を削除し、コンソールに送信しない.Out-Printer:出力をプリンタに送信する.Out-String:オブジェクトを文字列としてホストに送信する.Select-Object:オブジェクトまたはオブジェクトのセットを選択する指定で行ないます.また、オブジェクトの配列から一意のオブジェクトを選択するか、オブジェクトの配列の先頭または末尾から指定した数のオブジェクトを選択することもできます.Sort-object:属性値オブジェクトごとにソートします.Tee-Object:コマンド出力をファイルまたは変数に保存し、コンソールに表示します.Where-object:コマンドパイプに沿って渡されるオブジェクトを制御するフィルタを作成します.
パイプの処理モード
多くのネーミングをパイプに組み合わせると、各コマンドの実行が順番に実行されるか、同時に実行されるかに興味があるかもしれません.パイプ処理の結果は実際にはリアルタイムです.これは、2つのパイプライン・モードが存在する理由です.シーケンス・モード(遅い):シーケンス・モードでは、パイプラインで同じ時間に1つのコマンドのみが実行され、現在の1つのコマンドのすべての実行が完了している場合にのみ、すべての結果が次のコマンドに渡されます.このモードは速度が遅く、メモリが消費されます.中間結果を格納するために、空間を複数回割り当てる必要があるためです.フロー・モード(高速):フロー・モードでは、すべてのコマンドがすぐに実行され、同じ時間に複数のコマンドが実行される場合があります.前のコマンドでは複数の結果が生成される場合がありますが、いずれかの結果が生成されると、すぐに次のコマンド処理に渡されます.このようなフロー・モードでは、メモリが節約され、パイプラインのタスクが実行されている可能性がありますが、一部の結果が出力されています..中間結果の保存が減少しました.
パイプコマンドのブロック
Sort-Objectを使用してパイプの結果をソートできますが、ソートコマンドの実行は順序モードに属しているため、ソートコマンドの結果がすべて完了しなければソートできない場合があります.このようなコマンドを使用する場合は、オブジェクトのサイズとメモリに注意してください.たとえば、このコマンド:Dir C:-recurse|Sort-object-recurseオプションは再帰クエリサブディレクトリであり、システムディスクのファイルとディレクトリの大きさがわかります.このコマンドが実行されると、長い時間待たなければなりません.システムがクラッシュし、コンピュータを再起動しなければなりません.このコマンドを実行すると、タスクマネージャを開いてPowershellプロセスのメモリ消費量が毎秒数十兆ドル増加していることを確認できます.どのようなコマンドがシステム的にブロックされる可能性があるかは、コマンドの実装方法や処理対象のサイズによって決まります.例えば、Sort-objectがブロックを引き起こす原因は、技術的な実装で内部ソートが採用されており、外部ソートが使用されていないことに違いありません.しかし、Out-Host-pagingのようなコマンドはストリームモードに属し、一般的にシステムのブロックを招くことはありません.