共用方式為


about_Methods

簡短描述

描述如何使用 方法來對 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 方法之前執行。 Kill接著會在傳Process回的物件上叫用 方法。

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

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

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

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

瞭解方法

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

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

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

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

    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種方法將檔案C:\Bin複製到Final.txt目錄,並覆寫現有的檔案。

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

成員存取列舉

從 PowerShell 3.0 開始,當您使用成員存取運算子 () . 存取清單集合上不存在的方法時,PowerShell 會自動列舉集合中的專案,並在每個專案上叫用 方法。 如需詳細資訊,請參閱 about_Member-Access_Enumeration

範例

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

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

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

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

$p.Kill()
Get-Process Notepad

Get-Process命令會確認方法正常Kill運作。

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

使用採用檔案系統路徑的 .NET 方法

PowerShell 支援每個進程的多個 Runspace。 每個 Runspace 都有自己的 目前目錄。 這與目前進程的工作目錄不同: [System.Environment]::CurrentDirectory

.NET 方法會使用進程工作目錄。 PowerShell Cmdlet 會使用 Runspace 位置。 此外,.NET 方法只能使用原生文件系統路徑,而不是PowerShell Path物件。 若要搭配 .NET 方法使用 PowerShell 路徑,您必須先將路徑解析為文件系統原生路徑,再將路徑傳遞至 .NET 方法。

另請參閱