ja-JP/about_Methods.help.txt
|
TOPIC about_Methods 簡単な説明 オブジェクトに対してアクションを実行するメソッドの呼び出し方法に ついて説明します。 詳細な説明 PowerShell では、コマンドレットやスクリプトの出力としてオブジェクト を扱います。メソッドとは、そのオブジェクトに対して実行できるアクション を指定する一連の命令です。たとえば、プロセスを表すオブジェクトには、 そのプロセスを終了させる Kill メソッドがあります。 オブジェクトが持つメソッドを調べるには、Get-Member コマンドレットを 使用し、MemberType パラメーターに Method を指定します。 Get-Process | Get-Member -MemberType Method メソッドを呼び出すには、メンバーアクセス演算子 (.) のあとにメソッド名 と丸かっこ () を記述します。丸かっこの中には、メソッドの引数 (パラメー ター) を指定します。引数がない場合でも、丸かっこは省略できません。 $notepad = Get-Process notepad $notepad.Kill() オブジェクトを変数に格納せず、式に対して直接メソッドを呼び出すことも できます。この場合は、式全体を丸かっこで囲みます。 (Get-Process Notepad).Kill() 文字列などの単純な型に対してもメソッドを呼び出せます。次の例では、 文字列の一部を置換しています。 'this is rocket science'.Replace('rocket', 'rock') メソッドの定義 Get-Member の出力には、各メソッドの定義 (シグネチャ) が表示され ます。定義は、メソッドが受け取る引数の型と数、および戻り値の型を 示します。1 つのメソッドが複数のシグネチャを持つことがあり、これ をオーバーロードと呼びます。これはコマンドレットのパラメーター セットに似ています。 メソッド引数の渡し方 メソッドは、PowerShell のコマンド構文 (引数モード) ではなく、 式モードで評価されます。式モードでは、引用符で囲まないリテラル文字 列 (ベアワード) を引数として使用できません。したがって、ファイル パスなどを引数として渡すときは、必ず引用符で囲む必要があります。 次の例では、CopyTo メソッドを使ってファイルをコピーします。コピー 先のパスは引用符で囲まれています。 (Get-ChildItem C:\final.txt).CopyTo("C:\bin\final.txt") 多くのメソッドはオーバーロードを持ちます。CopyTo メソッドには、 コピー先が既に存在する場合に上書きするかどうかを指定する 2 番目の 引数 (overwrite) を受け取るオーバーロードがあります。 (Get-ChildItem C:\final.txt).CopyTo("C:\bin\final.txt", $true) コレクションでのメソッドの動作 PowerShell 3.0 以降では、メンバーアクセス演算子を使ってコレクション に対してメソッドを呼び出すと、PowerShell が自動的にコレクションを 列挙し、各要素に対してメソッドを実行する場合があります。 次の例では、3 つの Notepad プロセスを起動し、Count プロパティで その数を確認しています。 Notepad; Notepad; Notepad $p = Get-Process Notepad $p.Count 変数 $p には複数のプロセスオブジェクトが格納されています。Kill メソッドを呼び出すと、PowerShell がコレクションを列挙し、各プロセス に対して Kill を実行します。 $p.Kill() Get-Process Notepad ただし、この自動列挙はメソッドがコレクション自身に存在しない場合 に限られます。明示的に列挙するには、ForEach-Object を使用します。 $p | ForEach-Object {$_.Kill()} メソッドのオーバーロードと型の選択 複数のオーバーロードが存在する場合、PowerShell はより限定的でない (より一般的な) 型のオーバーロードを選択することがあります。特定の オーバーロードを呼び出したいときは、引数や対象を明示的にキャスト します。 次の例では、インターフェイス IFoo とそれを実装するクラス Foo を 定義します。Foo には Bar メソッドの直接の実装と、IFoo の明示的な 実装が含まれます。 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}"; } } '@ 既定では、Foo のインスタンスに対して Bar を呼び出すと、直接の メンバーメソッドが選択されます。 [Foo]::new().Bar(1) 明示的に実装されたインターフェイスのメソッドを呼び出すには、対象を インターフェイス型にキャストします。 ([IFoo] [Foo]::new()).Bar(1) .NET メソッドと作業ディレクトリ .NET のメソッドは、PowerShell のランスペースの場所 (Location) では なく、プロセスの作業ディレクトリを基準に動作します。そのため、相対 パスを .NET メソッドに渡すと、想定と異なる場所が参照されることが あります。PowerShell のパスを .NET メソッドに渡す前に、Resolve-Path や Convert-Path などでネイティブのファイルシステムパスに解決して おく必要があります。 関連項目 about_Objects about_Properties about_Operators Get-Member Add-Type ---- 原文: PowerShell-Docs (CC BY 4.0) の翻訳 / PSHelpJaJP |