共用方式為


關於方法

簡短描述

描述如何使用方法在PowerShell中對對象執行動作。

完整描述

PowerShell 會使用 物件來表示數據存放區中的項目或計算機的狀態。 例如,FileInfo 物件代表檔案系統磁碟機中的檔案,ProcessInfo 物件代表電腦上的處理程序。

物件具有屬性,可儲存關於物件的相關資料,以及可讓您變更物件的方法。

「方法」是一組指示,指定可對物件執行的動作。 例如, 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 方法之前執行。 接著會在 KillProcess 回的物件上叫用 方法。

另一個非常有用的方法是 Replace 字串的方法。 方法 Replace 會取代字串內的文字。 在下列範例中,點 (.) 可以緊接在字元串的結尾引號後面。

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

如先前範例所示,您可以使用命令、變數中的物件,或導致物件 (的任何專案叫用方法,例如引號中的字串) 。

從 PowerShell 4.0 開始,支援使用動態方法名稱的方法調用。

瞭解方法

若要尋找物件方法的定義,請移至物件類型的幫助主題,並尋找其方法頁面。 例如,下列頁面描述處理物件 System.Diagnostics.Process 的方法。

若要判斷方法的自變數,請檢閱方法定義,就像PowerShell Cmdlet的語法圖表一樣。

方法定義可能會有一或多個方法簽章,就像 PowerShell Cmdlet 的參數集一樣。 簽章會顯示叫用方法的所有有效命令格式。

例如,類別 CopyToFileInfo 方法包含下列兩個方法簽章:

    CopyTo(String destFileName)
    CopyTo(String destFileName, Boolean overwrite)

第一個方法簽章採用目的地檔案名稱 (和路徑)。 下列範例會使用第一CopyTo種方法將檔案C:\Bin複製到 Final.txt 目錄。

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

純量物件和集合的方法

特定類型的單一 (「純量」) 物件方法通常不同於同類型物件集合的方法。

例如,每個進程都有 Kill 方法,但進程集合沒有 Kill 方法。

從 PowerShell 3.0 開始,PowerShell 會嘗試防止因純量物件和集合的不同方法而產生的腳本錯誤。

如果您提交集合,但要求只存在於單一 (「純量」) 物件上的方法,PowerShell 會在集合中的每個物件上叫用 方法。

如果方法存在於個別物件和集合上,則只會叫用集合的方法。

這項功能也適用於純量物件和集合的屬性。 如需詳細資訊,請參閱 about_Properties

範例

下列範例會執行 物件集合中個別進程物件的 Kill 方法。

第一個命令會啟動「記事本」處理程序的三個執行個體。 Get-Process 會取得 [記事本] 程式的所有三個實例,並將其儲存在 變數中 $p

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

下一個命令會在變數中的所有三個進程$p上執行 Kill 方法。 即使進程集合沒有 方法,此命令仍可 Kill 運作。

$p.Kill()
Get-Process Notepad

命令 Get-ProcessKill 確認方法正常運作。

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 Cmdlet 在集合中的每個物件上執行 方法。

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

ForEach 和 Where 方法

從 PowerShell 4.0 開始,支援使用方法語法進行集合篩選。 這可讓您在處理集合 ForEachWhere時使用兩個新的方法。

您可以在 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}";
   }

}
'@

在此範例中,已選擇較不特定的 objectBar 方法多載。

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

在此範例中,我們會將 方法轉換成介面 IFoo ,以選取 Bar 方法的更具體多載。

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

另請參閱

about_Objects

about_Properties

Get-Member