【PowerShellを始める】その5)PowerShellのオブジェクト

1 はじめに

【初めてのPowerShell】第5回目は、
PowerShellオブジェクト(PowerShell Object)についてです。

PowerShellオブジェクトは、PowerShellにおけるデータの基本的な構成要素であり、
さまざまなデータの型や情報を表現するための手段です。

PowerShellの真の力を発揮するためには、オブジェクト(Object)の概念を理解することが
重要です。
PowerShellは、オブジェクト指向のシェルであり、
コマンドレットやスクリプトを通じてオブジェクトを操作することができます。

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

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

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

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

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

2 PowerShellオブジェクトとは?

まずは、PowerShellオブジェクトとはなんぞや?から。

PowerShellオブジェクト”は、文脈によって単に”オブジェクト”と記すこともあります。

2.1 PowerShellオブジェクト

PowerShellオブジェクトは、プロパティメソッドを持つデータの集合体です。

プロパティオブジェクトの属性を表し、
メソッドオブジェクトに対して実行できる操作を定義します。

たとえば、ファイルオブジェクトは、ファイル名やサイズといったプロパティを持ち、
ファイルを開く、コピーする、削除するなどのメソッドを持っています。

PowerShellオブジェクトは、さまざまなコマンドレットと組み合わせて使用されます。

たとえば、 ”Get-Process”コマンドレットは、実行中のプロセスに関する情報を含む
オブジェクトのコレクションを返します。
これにより、特定のプロセスの情報を簡単に取得したり、フィルタリングしたりすることができます。

2.2 メンバー

オブジェクトに含まれるプロパティメソッドを総称して、メンバーと呼びます。

すべてのオブジェクトは、.NETランタイムのものなので、
それぞれの型でどんな操作ができるかは、.NETランタイムのAPIを参照することで確認できます。

.NET API Browser

Get-Member”コマンドレットでも、確認することができます。

3 カスタムオブジェクトの作成

オブジェクトのタイプは、いろいろあるようです。

ユーザーが自由に定義するオブジェクトは、「カスタムオブジェクト」と呼ばれています。 カスタムオブジェクトは、
オブジェクトタイプを”PSObject”、あるいは”PSCustomObject”として作成します。
下に示すコマンドレット、または 型アクセラレーターで作成することができます。

New-Object
PSCustomObject

3.1 ”New—Object”コマンドレットによる作成

下に示す例は、”New-Object”コマンドレットにより、
オブジェクトタイプを”PSObject”としてカスタムオブジェクトを作成するものです。

PSObject型オブジェクトは、
メンバーがオブジェクトに追加された順序でメンバーのリストを保持します。

3.2 PSCustomObject

下に示すのは、オブジェクトタイプ ”PSCustomObject”の 型アクセラレータで、
カスタムオブジェクトを作成する例です。

4 オブジェクトの操作

本章では、オブジェクトを操作するコマンドレットの概要を示します。

4.1 スクリプトブロック

4.1.1 スクリプトブロックの概要

Where-Object”や ”ForEach-Object”のコマンドレットは、 スクリプトブロックを使用して、
プロパティ名比較演算子、およびプロパティ値を指定できます。

スクリプトブロックとは、下に示す構文の中括弧({})で囲まれたステートメントリストです。

{ <statement list> }

すべてのPowerShell比較演算子4.1.3項 比較演算子を参照)は、 スクリプトブロック形式で
有効です。

スクリプトブロック内に記述される”$_”は、現在処理しているオブジェクトを指す 自動変数です。

Where-ObjectForEach-Objectのコマンドレットは、
スクリプト ブロック ステートメントがTrueであるすべてのオブジェクトを返します。

下に示すのコマンド例は、
PriorityClassプロパティの値がNormalに等しいプロセスを取得します。

4.1.2 簡略化された構文

Windows PowerShell 3.0 で導入された簡略化された構文を使用すると、
スクリプトブロックを使用せずにいくつかのフィルターコマンドを作成することができます

簡略化された構文の詳細については、次のページをご覧ください。

about_Simplified_Syntax | Learn / PowerShell

下に例に示すように、簡略化された構文では、パラメーターのPropertyValueは省略可能です。

Propertyパラメーターは、位置0にマップされた位置パラメーターです。
Value パラメーターは、位置1にマップされた位置パラメーターです。

Get-Process | Where-Object -Property PriorityClass -Value Normal -eq
 
Get-Process | Where-Object PriorityClass -eq Normal

4.1.3 比較演算子

スクリプトブロック内での利用可能な比較演算子の一覧については、次のページをご覧ください。
【初めてのPowerShell】その5)PowerShellの演算子一覧 > 2.3比較演算子
【初めてのPowerShell】その5)PowerShellの演算子一覧 > 2.4マッチング演算子

演算子の詳細については、でご確認ください。
比較演算子 | Learn / PowerShell

4.2 オブジェクト操作のコマンドレット

オブジェクトを操作する主なコマンドレットを表4.3-1に示します。

表4.3-1 オブジェクトを操作する主なコマンドレット

コマンドレットエイリアス説明
New-Object3章 カスタムオブジェクトの作成
Compare-Objectcompare2セットのオブジェクトを比較する
Select-Objectselectオブジェクトまたはオブジェクトのプロパティを選択します。
Sort-Objectsortプロパティ値でオブジェクトを並べ替えます。
ForEach-Object%入力オブジェクトのコレクション内の各項目に対して操作を実行します。
Where-Object?, whereプロパティ値に基づいてコレクションからオブジェクトを選択します。
Measure-Objectmeasureオブジェクトの数値プロパティと、テキストのファイルなど文字列オブジェクト内の文字、単語、および行を計算します。
group指定したプロパティに対して同じ値を含むオブジェクトをグループ化します。
Tee-Objectteeコマンド出力をファイルまたは変数に保存し、パイプラインに送信します。

4.2.1 Compare-Object

Compare-Object”コマンドレットは、2セットのオブジェクトを比較します。

オブジェクトのセットの1つは参照<=)で、もう1つのオブジェクトセットは差分=>)です。

下に示す例では、プロセスオブジェクトのNameID
およびワーキングセット(WS)プロパティを持つオブジェクトを作成します。

【Testfile1】
dog
squirrel

【Testfile2】
cat
racoon

4.2.2 Select-Object

Select-Object”コマンドレットは、
オブジェクトまたはオブジェクトのセットの指定されたプロパティを選択します。

配列内の一意のオブジェクト、指定された数のオブジェクト、
または指定された位置にあるオブジェクトを選択することもできます。

コレクションからオブジェクトを選択するには、
First”、”Last”、”Unique”、”Skip”、および”Index”パラメーターを使用します。

オブジェクトのプロパティを選択するには、”Property”パラメーターを使用します。 プロパティを選択すると、
Select-Objectは、指定したプロパティのみを持つ新しいオブジェクトを返します。

【プロパティデオブジェクトを選択する】

【メモリが最も多いプロセスを選択する】

4.2.3 Sort-Object

Sort-Object”コマンドレットは、 オブジェクトのプロパティ値に基づいてオブジェクトを昇順
または降順で並べ替えます。

下に示す例では、”-Path”で指定されたディレクトリ内のファイルを長さ順に昇順で表示します。

4.2.4 ForEach-Object

ForEach-Object”コマンドレットは、
入力オブジェクトのコレクション内の各項目に対して操作を実行します。

入力オブジェクトは、コマンドレットにパイプ処理することも、
InputObject”パラメーターを使用して指定することもできます。

下に示す例では、3つの整数の配列を受け取り、それぞれの整数を1024で除算します。

4.2.5 Where-Object

Where-Object”コマンドレットは、渡されるオブジェクトのコレクションから、
特定のプロパティ値を持つオブジェクトを選択します。

たとえば、Where-Objectコマンドレットを使用して、特定の日付以降に作成されたファイル
特定のIDを持つイベント、または特定のバージョンのWindowsを使用するコンピューターなどを
選択することができます。

下に示す例では、DisplayNameWindowsから始まるサービスを取得します。

4.2.6 Measure-Object

Measure-Object”は、オブジェクトの数値プロパティと、
テキストのファイルなど文字列オブジェクト内の文字、単語、および行を計算します。

下に示す例では、現在のディレクトリ内のすべてのファイルのサイズ、
およびディレクトリ内のファイルの最小、最大、合計、および平均サイズを表示します。

4.2.7 Group-Object

Group-Object”コマンドレットは、指定したプロパティの値に基づいて、
グループ内のオブジェクトを表示します。

Group-Objectは、
プロパティ値ごとに1行のテーブルと、その値を持つ項目の数を表示する列を返します。

下に示す例では、$PSHOME下のファイルを再帰的に取得し、
ファイル名拡張子でグループ化します。

出力はSort-Objectコマンドレットに送信され、
指定された拡張機能で見つかったカウント、ファイルで並べ替えられます。 空の名はディレクトリを表します。

この例では、”NoElement”パラメーターを使用して、グループのメンバーを省略します。

4.2.8 Tee-Object

Tee-Object”コマンドレットは、出力をリダイレクトします。
出力は、ファイルまたは変数に格納され、パイプラインにも送信されます。

Tee-Objectがパイプラインの最後のコマンドである場合、
コマンド出力がプロンプトに表示されます。

以上

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

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

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

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

お問い合わせ