次の方法で共有


about_Methods

簡単な説明

PowerShell でメソッドを使用してオブジェクトに対してアクションを実行する方法について説明します。

長い説明

PowerShell では、オブジェクトを使用して、データ ストア内のアイテムまたはコンピューターの状態を表します。 たとえば、FileInfo オブジェクトはファイル システム ドライブ内のファイルを表し、ProcessInfo オブジェクトはコンピューター上のプロセスを表します。

オブジェクトには、オブジェクトに関するデータを格納するプロパティと、オブジェクトを変更できるメソッドがあります。

"メソッド" は、オブジェクトに対して実行できるアクションを指定する一連の命令です。 たとえば、 オブジェクトには FileInfo 、オブジェクトが CopyTo 表すファイルをコピーする メソッドが FileInfo 含まれています。

任意のオブジェクトのメソッドを取得するには、 コマンドレットを Get-Member 使用します。 値が "Method" の MemberType プロパティを使用します。 次のコマンドは、プロセス オブジェクトのメソッドを取得します。

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 以降では、動的メソッド名を使用したメソッド呼び出しがサポートされています。

メソッドについて学習する

オブジェクトのメソッドの定義を見つけるには、オブジェクトの種類のヘルプ トピックに移動し、そのメソッド ページを探します。 たとえば、次のページでは、 プロセス オブジェクト 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)

メンバーアクセス列挙

PowerShell 3.0 以降では、メンバー アクセス演算子 (.) を使用してリスト コレクションに存在しないメソッドにアクセスすると、PowerShell によってコレクション内の項目が自動的に列挙され、各アイテムに対して メソッドが呼び出されます。 詳細については、「 about_Member-Access_Enumeration」を参照してください。

次の例では、 オブジェクトのコレクション内の個々のプロセス オブジェクトの Kill メソッドを実行します。

最初のコマンドは、メモ帳プロセスの 3 つのインスタンスを開始します。 Get-Process は、メモ帳プロセスの 3 つのインスタンスをすべて取得し、変数に $p 保存します。

Notepad; Notepad; Notepad
$p = Get-Process Notepad
$p.Count
3

次のコマンドは、 変数内の 3 つのプロセスすべてに対して Kill メソッドを $p 実行します。 このコマンドは、プロセスのコレクションに メソッドがない Kill 場合でも機能します。

$p.Kill()
Get-Process Notepad

コマンドは Get-Process 、 メソッドが Kill 機能したことを確認します。

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

この例は、コマンドレットを使用してコレクション内の Foreach-Object 各オブジェクトに対して メソッドを実行するのと機能的に同じです。

$p | ForEach-Object {$_.Kill()}

ForEach メソッドと Where メソッド

PowerShell 4.0 以降では、メソッド構文を使用したコレクション フィルター処理がサポートされています。 これにより、コレクションと Whereを処理するときに 2 つの新しいメソッドをForEach使用できます。

これらのメソッドの詳細については、「about_arrays」を参照してください。

複数のオーバーロードが存在する場合の特定のメソッドの呼び出し

.NET メソッドを呼び出すときは、次のシナリオを検討してください。 メソッドがオブジェクトを受け取るが、より具体的な型を受け取るインターフェイスを介してオーバーロードがある場合、そのインターフェイスに明示的にキャストしない限り、PowerShell は オブジェクトを受け入れるメソッドを選択します。

Add-Type -TypeDefinition @'

   // Interface
   public interface IFoo {
     string Bar(int p);
   }

   // Type that implements the interface
   public class Foo : IFoo {

   // Direct member method named 'Bar'
   public string Bar(object p) { return $"object: {p}"; }

   // *Explicit* implementation of IFoo's 'Bar' method().
   string IFoo.Bar(int p) {
       return $"int: {p}";
   }

}
'@

この例では、Bar メソッドのより具体的objectでないオーバーロードが選択されています。

[Foo]::new().Bar(1)
object: 1

この例では、 メソッドをインターフェイス IFoo にキャストして、 Bar メソッドのより具体的なオーバーロードを選択します。

([IFoo] [Foo]::new()).Bar(1)
int: 1

ファイルシステム パスを取得する .NET メソッドの使用

PowerShell では、プロセスごとに複数の実行空間がサポートされます。 各実行空間には、独自の 現在のディレクトリがあります。 これは、現在のプロセスの作業ディレクトリと同じではありません: [System.Environment]::CurrentDirectory

.NET メソッドでは、プロセス作業ディレクトリが使用されます。 PowerShell コマンドレットでは、Runspace の場所が使用されます。 また、.NET メソッドは、PowerShell Path オブジェクトではなく、ネイティブ ファイルシステム パスでのみ機能します。 .NET メソッドで PowerShell パスを使用するには、ファイル システムネイティブ パスへのパスを .NET メソッドに渡す前に解決する必要があります。

こちらもご覧ください