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 cmdlet。使用其值为“Method”的 MemberType 属性。以下命令将获取进程对象的方法。

        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()

若要执行或“调用”对象的方法,请键入一个圆点 (.)、方法名称和一组括号“()”。如果该方法具有参数,请将参数值放置于括号内。甚至在没有参数时,每个方法调用也需要括号。

例如,以下命令调用进程的 Kill 方法以结束计算机上的 Notepad 进程。因此,关闭 Notepad 的实例。(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 cmdlet 的语法图类似的方法定义。

方法定义可能具有一个或多个方法签名,它们类似于 Windows PowerShell cmdlet 的参数集。签名显示用于调用方法的命令的所有有效格式。

例如,FileInfo 类的 CopyTo 方法包含以下两个方法签名:

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

第一个方法签名采用目标文件名(和路径)。下面的示例使用第一个 CopyTo 方法将 Final.txt 文件复制到 C:\Bin 目录。

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

第二个方法签名采用目标文件名和布尔值,该布尔值可确定是否应覆盖目标文件(如果已存在)。

下面的示例使用第二个 CopyTo 方法将 Final.txt 文件复制到 C:\Bin 目录,并覆盖现有文件。

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

标量对象和集合的方法

特定类型的一个(“标量”)对象的方法通常与相同类型的对象集合的方法不同。

例如,每个进程有一个 Kill 方法,但进程的集合没有 Kill 方法。

从 Windows PowerShell 3.0 开始,Windows PowerShell 尝试防止由标量对象和集合的不同方法导致的脚本错误。

从 Windows PowerShell 4.0 开始,支持使用方法语法进行集合筛选。

如果提交了某个集合,但请求的方法仅存在于单个(“标量”)对象上,Windows 将调用集合中每个对象的方法。

如果方法存在于单独对象上和集合上,则 Windows PowerShell 不会更改结果。

此功能还适用于标量对象和集合的属性。有关详细信息,请参阅 about_Properties。

示例

下面的示例对进程对象的集合运行单独进程对象的 Kill 方法。此示例仅适用于 Windows PowerShell 3.0 及更高版本的 Windows PowerShell。

第一个命令启动 Notepad 进程的三个实例。第二个命令使用 Get-Process 命令获取 Notepad 进程的所有三个实例并将其保存在 $p 变量中。

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

第三个命令使用所有集合的 Count 属性,以验证 $p 变量中是否存在三个进程。

        PS C:\>$p.Count
        3

第四个命令对 $p 变量中的所有三个进程运行 Kill 方法。

即使进程的集合没有 Kill 方法,该命令也起作用。

        PS C:\>$p.Kill()

第五个命令使用 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 cmdlet 对集合中的每个对象运行该方法。

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

另请参阅

about_Objects

about_Properties

Get-Member