关于方法

简短说明

介绍如何使用方法对 PowerShell 中的对象执行操作。

详细说明

PowerShell 使用对象来表示数据存储中的项或计算机的状态。 例如,FileInfo 对象表示文件系统驱动器中的文件,ProcessInfo 对象表示计算机上的进程。

对象具有属性,用于存储有关对象的数据,以及可用于更改对象的方法。

“method”是一组指令,用于指定可以对对象执行的作。 例如,FileInfo 对象包括复制 CopyTo 对象所表示文件的 FileInfo 方法。

若要获取任何对象的方法,请使用 Get-Member cmdlet。 使用其 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 方法。

另一种非常有用的方法是字符串 Replace 方法。 Replace 方法替换字符串中的文本。 在下面的示例中,点(.)可以紧接在字符串的尾引号后面。

'this is rocket science'.Replace('rocket', 'rock')
this is rock science

如前面的示例所示,可以使用命令、变量中的对象或导致对象的任何内容(如引号中的字符串)调用方法。

从 PowerShell 4.0 开始,支持使用动态方法名称的方法调用。

了解方法

若要查找对象方法的定义,请转到 MSDN 中对象类型的帮助主题,并查找其方法页。 例如,以下页面介绍了 System.Diagnostics.Process 进程对象的方法。

若要确定方法的参数,请查看方法定义,这类似于 PowerShell cmdlet 的语法关系图。

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

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

    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 框架的传递。 在 表达式 模式下,不允许 裸字 参数(无引号字符串)。 您可以在差异路径中将其视为参数,而不是将路径视为参数。 可以在 about_Parsing 中详细了解分析模式

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

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

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

标量对象和 Collections 的方法

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

例如,每个进程都有一个 Kill 方法,但一组进程没有 Kill 方法。

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

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

如果该方法存在于各个对象和集合上,则仅调用集合的方法。

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

例子

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

第一个命令启动记事本进程的三个实例。 第二个命令使用该 Get-Process 命令获取记事本进程的所有三个实例,并将它们保存在 $p 变量中。

Notepad; Notepad; Notepad
$p = Get-Process Notepad

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

$p.Count
3

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

即使进程集合没有 Kill 方法,此命令也能正常工作。

$p.Kill()

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

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

ForEach 和 Where 方法

从 PowerShell 4.0 开始,支持使用方法语法进行集合筛选。 这允许在处理集合 ForEachWhere时使用两个新方法。

可以在 about_arrays 中详细了解这些方法

另请参阅

about_Objects

关于属性

获取成员