about_Methods

適用対象: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0

トピック

about_methods

簡単な説明

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

詳細な説明

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

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

"メソッド" は、そのオブジェクトで実行できるアクションを指定する命令の集まりです。たとえば、FileInfo オブジェクトには CopyTo というメソッドがあります。このメソッドを使用すると、FileInfo オブジェクトで表されるファイルをコピーできます。

特定のオブジェクトのメソッドを取得するには、Get-Member コマンドレットを使用します。MemberType プロパティの値に「Method」を指定して呼び出します。次のコマンドでは、プロセス オブジェクトのメソッドを取得します。

        PS C:\>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), System.Void WaitForExit()
         WaitForInputIdle          Method     bool WaitForInputIdle(int milliseconds), bool WaitForInputIdle()

オブジェクトのメソッドを実行する、すなわち"呼び出す" には、ドット (.)、メソッド名、そして 1 組のかっこ "()" を入力します。メソッドに引数がある場合は、かっこの中に引数の値を配置します。かっこは、すべてのメソッド呼び出しに必要です。引数がない場合でもかっこを記述します。

たとえば、次のコマンドでは、コンピューター上のメモ帳のプロセスを終了させるために、プロセスの Kill メソッドを呼び出します。その結果、メモ帳のインスタンスが閉じられます。(Get-Process コマンドを Kill メソッドの呼び出しより確実に先に実行するため、コマンドをかっこで囲んでいます。)

        (Get-Process Notepad).Kill()

もう一つの非常に便利なプロセスは、文字列の Split メソッドです。Split メソッドは区切り文字を引数として受け取って、文字列の分割箇所を認識します。

        PS C:\>$a = "Try-Catch-Finally"
        PS C:\>$a.Split("-")
        Try
        Catch
        Finally

前出の例のように、変数でコマンドまたはオブジェクトを用いて取得したオブジェクトに、メソッドを呼び出すことができます。

Windows PowerShell 4.0 以降で、動的なメソッド名を使用したメソッドの呼び出しがサポートされています。

メソッドについて学ぶ。

オブジェクトのメソッドの定義を調べるには、MSDN で調べたい種類のオブジェクトのヘルプ トピックを参照し、メソッドのページを探します。たとえば、次のページには、プロセス オブジェクト (System.Diagnostics.Process) のメソッドについての説明があります。

         https://msdn.microsoft.com/library/system.diagnostics.process_methods

メソッドの引数を決めるには、Windows PowerShell コマンドレットの構文を図のように示した、メソッドの定義を確認します。

メソッドの定義には、Windows PowerShell コマンドレットのパラメーター セットのように、1 つ以上のメソッド シグネチャがある場合があります。シグネチャは、メソッドを呼び出すコマンドの有効な形式をすべて表示します。

たとえば、FileInfo クラスの CopyTo メソッドには、次の 2 つのメソッド シグネチャが含まれています。

        1. CopyTo(String destFileName)
        2. CopyTo(String destFileName, Boolean overwrite)

最初のメソッド シグネチャは、コピー先ファイル名 (およびパス) を受け取ります。次の例では、最初の CopyTo メソッドを使用して、C:\Bin ディレクトリに Final.txt ファイルをコピーします。

        (Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt")

2 番目のメソッド シグネチャは、コピー先のファイル名と、同名のファイルが既に存在する場合、コピー先ファイルを上書きするかどうかを決定するブール値を受け取ります。

次の例では、2 番目の CopyTo メソッドを使用して、Final.txt ファイルを C:\Bin ディレクトリにコピーし、既存のファイルを上書きします。

        (Get-ChildItem c:\final.txt).CopyTo("c:\bin\final.txt", $true)

スカラー オブジェクトおよびコレクションのメソッド

多くの場合、あるタイプの 1 つの ("スカラー") オブジェクトのメソッドは多くの場合、同じタイプのコレクション オブジェクトのメソッドとは性質が異なります。

たとえば、すべてのプロセスには Kill メソッドがありますが、プロセスのコレクションには Kill メソッドがありません。

Windows PowerShell 3.0 以降、Windows PowerShell ではスカラー オブジェクトとコレクションのメソッドの違いから起こるスクリプティング エラーを防ぐよう努めています。

Windows PowerShell 4.0 以降では、メソッド構文を用いたコレクションのフィルタリングがサポートされています。

コレクションを送りながら、1 つの ("スカラー") オブジェクトだけに存在するメソッドを呼び出そうとすると、Windows はそのコレクションの全オブジェクトに対してメソッドを呼び出します。

個々のオブジェクトおよびコレクションにメソッドが存在する場合、Windows PowerShell による結果は変わりません。

この機能は、スカラー オブジェクトおよびコレクションのプロパティでも機能します。詳細については about_Properties を参照してください。

次の例では、プロセス オブジェクトのコレクションで、個々のプロセス オブジェクトの Kill メソッドを実行します。この例は Windows PowerShell 3.0 および、より新しいバージョンの Windows PowerShell 上でのみ動作します。

最初のコマンドでは、Notepad (メモ帳) プロセスの インスタンスを 3 つ起動します。2 番目のコマンドでは、Get-Process コマンドを使用して、Notepad プロセスの 3 つすべてのインスタンスを取得して変数 $p に保存します。

        PS C:\>Notepad; Notepad; Notepad
        PS C:\>$p = Get-Process Notepad
        

3 番目のコマンドでは、すべてのコレクションにある Count プロパティを使用して、変数 $p に 3 つのプロセスがあることを確認します。

        PS C:\>$p.Count
        3

4 番目のコマンドでは、変数 $p に記述された 3 つのプロセスすべてに Kill メソッドを実行します。

プロセスのコレクションには Kill メソッドがありませんが、それでもこのコマンドは動作します。

        PS C:\>$p.Kill()

5 番目のコマンドでは、Get-Process コマンドを使用して、Kill コマンドが動作したことを確認します。

        PS C:\>Get-Process Notepad
        Get-Process : Cannot find a process with the name "notepad". Verify the process name and call the cmdlet again.
        At line:1 char:12
        + get-process <<<<  notepad
            + CategoryInfo          : ObjectNotFound: (notepad:String) [Get-Process], ProcessCommandException
            + FullyQualifiedErrorId : NoProcessFoundForGivenName,Microsoft.PowerShell.Commands.GetProcessCommand

Windows PowerShell 2.0 で同じことをするには、Foreach-Object コマンドレットを使ってコレクションの各オブジェクトに対して Kill メソッドを実行する必要があります。

        PS C:\>$p | Foreach-Object {$_.Kill()}

関連項目

about_Objects

about_Properties

Get-Member