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 開始,支援使用方法語法的集合篩選。 這允許在處理集合 ForEach
和 Where
時使用兩個新的方法。
您可以在 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}";
}
}
'@
在此範例中,已選擇較不特定的 object
Bar 方法多載。
[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 方法。