簡単な説明
PowerShell でメソッドを使用してオブジェクトに対してアクションを実行する方法について説明します。
長い説明
PowerShell では、オブジェクトを使用して、データ ストア内の項目またはコンピューターの状態を表します。 たとえば、FileInfo オブジェクトはファイル システム ドライブ内のファイルを表し、ProcessInfo オブジェクトはコンピューター上のプロセスを表します。
オブジェクトには、オブジェクトに関するデータを格納するプロパティと、オブジェクトを変更できるメソッドがあります。
"メソッド" は、オブジェクトに対して実行できるアクションを指定する一連の命令です。 たとえば、FileInfo オブジェクトには、CopyTo オブジェクトが表すファイルをコピーする FileInfo メソッドが含まれています。
任意のオブジェクトのメソッドを取得するには、Get-Member コマンドレットを使用します。
MemberType プロパティを使用し、値を "Method" にします。 次のコマンドは、プロセス オブジェクトのメソッドを取得します。
Get-Process | Get-Member -MemberType Method
TypeName: System.Diagnostics.Process
Name MemberType Definition
---- ---------- ----------
BeginErrorReadLine Method System.Void BeginErrorReadLine()
BeginOutputReadLine Method System.Void BeginOutputReadLine()
...
Kill Method System.Void Kill()
Refresh Method System.Void Refresh()
Start Method bool Start()
ToString Method string ToString()
WaitForExit Method bool WaitForExit(int milliseconds), ...
WaitForInputIdle Method bool WaitForInputIdle(int millisecon...
オブジェクトのメソッドを実行または "呼び出す" には、ドット (.)、メソッド名、およびかっこ "()" のセットを入力します。 メソッドに引数がある場合は、引数の値をかっこ内に配置します。 引数がない場合でも、すべてのメソッド呼び出しにかっこが必要です。 メソッドが複数の引数を受け取る場合は、コンマで区切る必要があります。
たとえば、次のコマンドは、プロセスの Kill メソッドを呼び出して、コンピューター上のメモ帳プロセスを終了します。
$notepad = Get-Process notepad
$notepad.Kill()
この例は、上記のステートメントを組み合わせることで短縮できます。
(Get-Process Notepad).Kill()
Get-Process コマンドはかっこで囲んで、Kill メソッドが呼び出される前に実行されるようにします。
Kill メソッドは、返された Process オブジェクトで呼び出されます。
もう 1 つの非常に便利なメソッドは、文字列の Replace メソッドです。
Replace メソッドは、文字列内のテキストを置き換えます。 次の例では、ドット (.) は文字列の終了引用符の直後に配置できます。
'this is rocket science'.Replace('rocket', 'rock')
this is rock science
前の例に示すように、コマンド、変数内のオブジェクト、またはオブジェクト (引用符で囲まれた文字列など) を使用して取得したオブジェクトに対してメソッドを呼び出すことができます。
PowerShell 4.0 以降では、動的メソッド名を使用したメソッド呼び出しがサポートされています。
メソッドについて学習する
オブジェクトのメソッドの定義を見つけるには、MSDN のオブジェクトの種類に関するヘルプ トピックに移動し、そのメソッド ページを探します。 たとえば、次のページでは、System.Diagnostics.Process プロセス オブジェクトのメソッドについて説明します。
メソッドの引数を確認するには、PowerShell コマンドレットの構文図のようなメソッド定義を確認します。
メソッド定義には、PowerShell コマンドレットのパラメーター セットのような 1 つ以上のメソッド シグネチャがある場合があります。 シグネチャには、メソッドを呼び出すコマンドのすべての有効な形式が表示されます。
たとえば、CopyTo クラスの FileInfo メソッドには、次の 2 つのメソッド シグネチャが含まれています。
CopyTo(String destFileName)
CopyTo(String destFileName, Boolean overwrite)
最初のメソッド シグネチャは、宛先ファイル名 (およびパス) を受け取ります。 次の例では、最初の CopyTo メソッドを使用して、Final.txt ファイルを C:\Bin ディレクトリにコピーします。
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")
注
PowerShell の 引数 モードとは異なり、オブジェクト メソッドは、式 モードで実行されます。これは、PowerShell が構築されている .NET フレームワークへのパススルーです。 式 モードでは、bareword 引数 (引用符で囲まれていない文字列) を することはできません。 これは、引数としてのパスに対して、パラメーターとしてのパスの違いで確認できます。 解析モードの詳細については、about_Parsing
2 番目のメソッド シグネチャは、宛先ファイル名と、宛先ファイルがすでに存在する場合に上書きする必要があるかどうかを決定するブール値を受け取ります。
次の例では、2 番目の CopyTo メソッドを使用して、Final.txt ファイルを C:\Bin ディレクトリにコピーし、既存のファイルを上書きします。
(Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)
スカラーオブジェクトとコレクションのメソッド
特定の型の 1 つの (「スカラー」) オブジェクトのメソッドは、多くの場合、同じ型のオブジェクトのコレクションのメソッドとは異なります。
たとえば、すべてのプロセスには Kill メソッドがありますが、プロセスのコレクションには Kill メソッドがありません。
PowerShell 3.0 以降、PowerShell は、スカラー オブジェクトとコレクションの異なるメソッドに起因するスクリプト エラーを防止しようとします。
コレクションを送信したが、1 つの ("スカラー") オブジェクトにのみ存在するメソッドを要求した場合、PowerShell はコレクション内のすべてのオブジェクトでメソッドを呼び出します。
メソッドが個々のオブジェクトとコレクションに存在する場合、コレクションのメソッドのみが呼び出されます。
この機能は、スカラー オブジェクトとコレクションのプロパティでも機能します。 詳細については、「 about_Properties」を参照してください。
例示
次の例では、プロセス オブジェクトのコレクションに対して、個々のプロセス オブジェクトの Kill メソッドを実行します。 この例は、PowerShell 3.0 以降のバージョンの PowerShell でのみ機能します。
最初のコマンドは、メモ帳プロセスの 3 つのインスタンスを開始します。 2 番目のコマンドは、 Get-Process コマンドを使用して、メモ帳プロセスの 3 つのインスタンスをすべて取得し、それらを $p 変数に保存します。
Notepad; Notepad; Notepad
$p = Get-Process Notepad
3 番目のコマンドは、すべてのコレクションの Count プロパティを使用して、$p 変数に 3 つのプロセスがあることを確認します。
$p.Count
3
4 番目のコマンドは、$p 変数の 3 つのプロセスすべてで Kill メソッドを実行します。
このコマンドは、プロセスのコレクションに Kill メソッドがない場合でも機能します。
$p.Kill()
5 番目のコマンドは、Get-Process コマンドを使用して、 Kill コマンドが機能したことを確認します。
Get-Process Notepad
Get-Process : Cannot find a process with the name "notepad". Verify the proc
ess name and call the cmdlet again.
At line:1 char:12
+ Get-Process <<<< notepad
+ CategoryInfo : ObjectNotFound: (notepad:String) [Get-Process]
, ProcessCommandException
+ FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShel
l.Commands.GetProcessCommand
PowerShell 2.0 で同じタスクを実行するには、 Foreach-Object コマンドレットを使用して、コレクション内の各オブジェクトでメソッドを実行します。
$p | ForEach-Object {$_.Kill()}
ForEach メソッドおよび Where メソッド
PowerShell 4.0 以降では、メソッド構文を使用したコレクションのフィルター処理がサポートされています。 これにより、コレクション ForEach と Whereを処理するときに、2 つの新しいメソッドを使用できます。
これらのメソッドの詳細については、about_arrays