このページの本文へ

前へ 1 2 次へ

Windows Info 第394回

コマンドの出力が長いとき、PowerShellではとりあえずselect-objectでなんとかする

2023年08月27日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

Unixではこの問題にどう対処してきたのか?

 Unixは、まだ端末装置が機械式で、出力装置がプリンターだった時代から使われてきた。プリンターの出力は、画面出力に比べて遅く、大量の情報を印字するのには不向きである。また、不要な出力は紙を消費してしまいコストもかかる。このため、Unixでは、コマンドの出力が多数になるような場合の対策が用意された。それがheadやtailコマンドである。これらは1974年に作られたPWB/UNIXで搭載された。

 headコマンドは、出力の先頭部分から指定された行数を出力し、tailコマンドは末尾から指定行数を出力する。引数を省略すると10行が仮定される。また、manページには記載がないが、オプション文字を省略して「-3」のような形式で行数を指定することもできる。これは、初期のUnixの記法で「-n 3」と同じ意味だ。ただし、これは、古い書式なので他のオプションとの組み合わせに制限がある。詳細はmanページなどを参照されたい。

 こうしたコマンドを使うことで、長い出力の一部を取り出せるようになっている。そのほかに、特定の文字列を検索するgrepコマンドやsedなどのテキスト処理プログラムがある。

 cmd.exeには、こうしたコマンドがほとんどなく、Unixから受け継いだのはmoreコマンドのみだが、PowerShellでは、Unixと同等の機能を持つコマンドがある。こうしたコマンドを使うことで、長いコマンド出力から一部を取り出すことが可能になる。

Select-Objectコマンド

 PowerShellで、大量のコマンド出力を扱うには、Select-Objectを使う。

 以下の表に、Select-Objectコマンドの主要なオプションを示した。Select-Objectには、大きく、行(配列要素)の出力制御とプロパティの出力制御の2つの機能がある(それ以外にもあるのだが、今回は省略)。

 行の制御では、「-First」「-Last」で先頭、末尾からの出力要素数を指定できる。両方を同時に指定すると、先頭のn個、末尾のm個となる。これに対して出力しない要素を先頭、末尾から指定するには、「-Skip」「-SkipLast」を使う。これらのコマンドは組み合わせて利用できる。

 もう1つの行の制御は、0から始まるインデックス番号で出力の可否を行うもの。インデックス番号はカンマで区切って複数指定できるほか、範囲式をカッコで括ったものを使うことができる。たとえば、「(2..7)」は、「2,3,4,5,6,7」と同じになる。このタイプのオプションでは、特定の行のみを出力する「-Index」と「-SkipIndex」がある。なお、この2つのオプションは同時には指定できない。「行制御」コマンドとも一緒には使えない。

 「-uniq」は、コマンド出力に、重複するオブジェクトが含まれている場合にそれを1つだけ残して残りを削除する。オブジェクトが単純な文字列や数値であれば、単に重複の削除になるが、複雑なオブジェクトではプロパティと値の組がすべて等しいかどうかで判断される。また、このオプションの優先順位は低く、他のオプションの処理が先にされ、最後に重複が堅守される。ただし、前記の行制御コマンドやインデックス行制御コマンドのどれとも同時に指定が可能だ。

 Select-Objectのもう1つの役割は、オブジェクトのプロパティの出力だ。前述のようにコマンドからオブジェクトを直接コンソールに出力するときには、自動で書式が設定され、利用頻度が高いと思われるプロパティのみが表示される。

 しかし、Select-Objectコマンドをパイプラインで接続することで、出力するプロパティ(あるいは出力しないプロパティ)を指定できる。このとき、プロパティ名にはワイルドカード('*')が利用できる。たとえば、「Select-Object *」とすることで、すべてのプロパティを出力できる。なお、プロパティ関連のオプション(省略された-Propertyオプションを含む)を何も指定しないと、出力は自動書式設定される。

 似たような機能にFormat-TableやFormat-Listコマンドがあるが、これらは書式設定のコマンドであり、出力はFormatオブジェクト(Microsoft.PowerShell.Commands.Internal.Formatオブジェクト)になる。しかし、Select-Objectの出力は、元のオブジェクトのままでプロパティのみが指定されたものになる。また、Format-系コマンドは、Select-Objectの-Firstのような行制御のオプションを持たない。

 Select-Objectコマンドは、基本的なコマンドといってよく、使い方に慣れることで、PowerShellでの作業がラクになるはずだ。

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン