about_Functions
適用於: Windows PowerShell 2.0, Windows PowerShell 3.0
主題
about_Functions
簡短描述
說明如何在 Windows PowerShell® 中建立並使用函式。
詳細描述
函式是 Windows PowerShell 陳述式的清單,具有您指派的名稱。當執行函式時,您會輸入函式名稱。清單中的陳述式會如同您在命令提示字元中輸入般執行。
函式可以像是下列範例一樣簡單:
function Get-PowerShellProcess {Get-Process PowerShell}
或者如同 Cmdlet 或應用程式一樣複雜。
函式像 Cmdlet 一樣,可以具有參數。參數可以是具名、位置、切換或動態參數。函式參數可以從命令列或管線讀取。
函數可以傳回值,該值可以顯示、指派給變數,或傳遞到其他函式或 Cmdlet。
函式的陳述式清單可以包含不同類型的陳述式清單,其中具有關鍵字 Begin、Process 和 End。這些陳述式清單以不同方式處理來自管線的輸入。
篩選是一種特殊的函式,使用關鍵字 Filter。
函式也可以像是 Cmdlet。您可以不使用 C# 程式設計的方式來建立和 Cmdlet 運作方式相同的函式。如需詳細資訊,請參閱 about_Functions_Advanced (https://go.microsoft.com/fwlink/?LinkID=144511)。
語法
函式的語法如下:
function [<scope:>]<name> [([type]$parameter1[,[type]$parameter2])]
{
param([type]$parameter1 [,[type]$parameter2])
dynamicparam {<statement list>}
begin {<statement list>}
process {<statement list>}
end {<statement list>}
}
函式包含下列項目:
- A Function keyword
- A scope (optional)
- A name that you select
- Any number of named parameters (optional)
- One or more Windows PowerShell commands enclosed in braces ({})
如需有關 Dynamicparam 關鍵字和函式中的動態參數的詳細資訊,請參閱 about_Functions_Advanced_Parameters。
簡單的函式
函式不需要太複雜就很有用。最簡單的函式具有下列格式:
function <function-name> {statements}
例如,下列函式使用 [以系統管理員身分執行] 選項,啟動 Windows PowerShell。
function Start-PSAdmin {Start-Process PowerShell -Verb RunAs}
若要使用函式,請輸入:Start-PSAdmin
若要將陳述式新增至函式,使用分號 (;) 來分隔陳述式,或在單獨一行中輸入各個陳述式。
例如,下列函式會尋找目前使用者的目錄中在開始日期之後變更的所有 .jpg 檔案。
function Get-NewPix
{
$start = Get-Date -Month 1 -Day 1 -Year 2010
$allpix = Get-ChildItem -Path $env:UserProfile\*.jpg -Recurse
$allpix | where {$_.LastWriteTime -gt $Start}
}
您可以建立有用小函式的工具箱。如 about_Profiles 中與本主題稍後所述,將這些函式新增至您的 Windows PowerShell 設定檔。
函式名稱
您可以為函式指派任何名稱,但是與其他人共用的函式應該遵循為所有 Windows PowerShell 命令建立的命名規則。
函式名稱應該包含動詞-名詞配對,其中動詞會識別函式執行的動作,而名詞會識別此 Cmdlet 執行其動作所在的項目。
函式應該使用對所有 Windows PowerShell 命令已核准的標準動詞。這些動詞會幫助我們讓命令名稱保持簡單、一致且方便使用者了解。
如需有關標準 Windows PowerShell 動詞的詳細資訊,請參閱 MSDN 上的<Cmdlet 動詞>,位於:https://go.microsoft.com/fwlink/?LinkID=160773。
具有參數的函式
您可以對函式使用參數,包括具名的參數、位置參數、切換參數和動態參數。如需函式中動態參數的詳細資訊,請參閱 about_Functions_Advanced_Parameters (https://go.microsoft.com/fwlink/?LinkID=135173)。
具名的參數
您可以定義任何數目的具名參數。您可以如本主題稍後所述來包含具名參數的預設值。
您可以定義大括弧內具有 Param 關鍵字的參數,如下列範例語法所示:
function <name> {
param ([type]$parameter1[,[type]$parameter2])
<statement list>
}
您也可以定義大括弧外沒有 Param 關鍵字的參數,如下列範例語法所示:
function <name> [([type]$parameter1[,[type]$parameter2])] {
<statement list>
}
這兩個方法之間沒有任何差異。使用您偏好的方法。
當您執行此函式時,會將您對參數提供的值指派給包含參數名稱的變數。該變數的值可用於函式中。
下列範例是稱為 Get-SmallFiles 的函式。此函式具有 $size 參數。函式會顯示小於 $size 參數值的所有檔案,並且會排除目錄:
function Get-SmallFiles {
param ($size)
Get-ChildItem c:\ | where {$_.Length -lt $Size -and !$_.PSIsContainer}
}
在函式中,您可以使用 $size 變數,這是針對參數定義的名稱。
若要使用此函式,輸入下列命令:
C:\PS> function Get-SmallFiles –Size 50
您也可以輸入不含參數名稱的具名參數的值。例如,下列命令會提供與命名 Size 參數之命令相同的結果:
C:\PS> function Get-SmallFiles 50
若要定義參數的預設值,在參數名稱後面輸入等號和值,如 Get-SmallFiles 範例的下列變數中所示:
function Get-SmallFiles ($size = 100) {
Get-ChildItem c:\ | where {$_.Length -lt $Size -and !$_.PSIsContainer}
}
如果您輸入 "Get-SmallFiles" 時沒有值,函式會指派 100 給 $size。如果您提供值,函式會使用該值。
(選擇性) 您可以提供描述參數預設值的簡短說明字串,方法是將 PSDefaultValue 屬性新增至您的參數描述,並指定 PSDefaultValue 的 Help 屬性。若要提供說明字串,描述 Get-SmallFiles 函式中 Size 參數的預設值 (100),請新增 PSDefaultValue 屬性,如下列範例所示。
function Get-SmallFiles {
param (
[PSDefaultValue(Help = '100')]
$size = 100
)
如需有關 PSDefaultValue 屬性類別的詳細資訊,請參閱 MSDN 上的<PSDefaultValue 屬性成員>。(https://msdn.microsoft.com/library/windows/desktop/system.management.automation.psdefaultvalueattribute\_members(v=vs.85).aspx
位置參數
位置參數是不含參數名稱的參數。Windows PowerShell 會使用參數值順序讓每個參數值與函式中的參數產生關聯。
當您使用位置參數時,請在函式名稱後面輸入一或多個值。位置參數值會指派給 $args 陣列變數。接在函式名稱後面的值會指派至 $args 陣列 $args[0] 的第一個位置。
下列 Get-Extension 函式會將 .txt 副檔名新增至您提供的檔案名稱:
function Get-Extension {
$name = $args[0] + ".txt"
$name
}
C:\PS> Get-Extension myTextFile
myTextFile.txt
切換參數
切換參數是不需要值的參數。而是您輸入函式名稱後面接續切換參數的名稱。
若要定義切換參數,指定參數名稱前面的類型 [切換參數],如下列範例所示:
function Switch-Item {
param ([switch]$on)
if ($on) { "Switch on" }
else { "Switch off" }
}
當您在函式名稱後面輸入 On 切換參數時,函式會顯示「開啟」。沒有切換參數時,它會顯示「關閉」。
C:\PS> Switch-Item -on
Switch on
C:\PS> Switch-Item
Switch off
當您執行函式時,您也可以將布林值指派給切換參數,如下列範例所示:
C:\PS> Switch-Item -on:$true
Switch on
C:\PS> Switch-Item -on:$false
Switch off
使用 Splatting 代表命令參數
您可以使用展開來代表命令的參數。此功能是在 Windows PowerShell 3.0 中引進。
在工作階段中呼叫命令的函式中使用這項技術。您不需要宣告或列舉命令參數,或在命令參數變更時變更函式。
下列範例函式會呼叫 Get-Command Cmdlet。命令會使用 @Args 代表 Get-Command 的參數。
function Get-MyCommand { Get-Command @Args }
當您呼叫 Get-MyCommand 函式時,可以使用 Get-Command 的所有參數。參數和參數值會傳遞給使用 @Args 的命令。
PS C:\>Get-MyCommand -Name Get-ChildItem
CommandType Name ModuleName
----------- ---- ----------
Cmdlet Get-ChildItem Microsoft.PowerShell.Management
@Args 功能會使用 $Args 自動參數,其代表剩餘的引數中未宣告的 Cmdlet 參數和值。
如需展開的相關詳細資訊,請參閱 about_Splatting (https://go.microsoft.com/fwlink/?LinkId=262720)。
將物件輸送至函式
任何函式可以接受來自管線的輸入。您可以使用 Begin、Process 和 End 關鍵字,控制函式如何處理來自管線的輸入。下列範例語法顯示三個關鍵字:
function <name> {
begin {<statement list>}
process {<statement list>}
end {<statement list>}
}
Begin 陳述式清單只會在函式的開頭執行一次。
Process 陳述式清單會對管線中的每個物件各執行一次。執行 Process 區塊時,會將每個管線物件指派給 $_ 自動變數,一次一個管線物件。
函式接收管線中的所有物件之後,End 陳述式清單就會執行一次。如果未使用 Begin、Process 或 End 關鍵字,所有陳述式會被視為 End 陳述式清單。
下列函式使用 Process 關鍵字。函式會顯示來自管線的範例:
function Get-Pipeline
{
process {"The value is: $_"}
}
為了示範這個函式,請如下列範例所示輸入以逗號分隔的數字清單:
C:\PS> 1,2,4 | Get-Pipeline
The value is: 1
The value is: 2
The value is: 4
當您在管線中使用函式時,輸送至函式的物件會指派給 $input 自動變數。函式會在管線輸出任何物件之前,執行具有 Begin 關鍵字的陳述式。函式會在從管線接收所有物件之後,執行具有 End 關鍵字的陳述式。
下列範例顯示具有 Begin 和 End 關鍵字的 $input 自動變數。
function Get-PipelineBeginEnd
{
begin {"Begin: The input is $input"}
end {"End: The input is $input" }
}
如果此函式是藉由使用管線來執行,它會顯示下列結果:
C:\PS> 1,2,4 | Get-PipelineBeginEnd
Begin: The input is
End: The input is 1 2 4
Begin 陳述式執行時,函式沒有來自管線的輸入。End 陳述式會在函式具有值之後執行。
如果函式具有 Process 關鍵字,則函式會讀取 $input 中的資料。下列範例具有 Process 陳述式清單:
function Get-PipelineInput
{
process {"Processing: $_ " }
end {"End: The input is: $input" }
}
在此範例中,每個輸送至函式的物件會傳送至 Process 陳述式清單。Process 陳述式會在每個物件上執行,一次一個物件。當函式達到 End 關鍵字時,$input 自動變數是空的。
C:\PS> 1,2,4 | Get-PipelineInput
Processing: 1
Processing: 2
Processing: 4
End: The input is:
篩選
篩選是一種函式,其會對管線中的每個物件執行。篩選類似於 Process 區塊中其所有陳述式的函式。
篩選的語法如下所示:
filter [<scope:>]<name> {<statement list>}
下列篩選會從管線記錄項目,然後會顯示整個項目或僅顯示項目的訊息部分:
filter Get-ErrorLog ([switch]$message)
{
if ($message) { out-host -inputobject $_.Message }
else { $_ }
}
函式範圍
函式存在於其建立所在的範圍。
如果函式是指令碼的一部分,則函式可用於該指令碼內的陳述式。根據預設,指令碼中的函式無法在命令提示字元中使用。
您可以指定函式的範圍。例如,函式會新增至下列範例中的全域範圍:
function global:Get-DependentSvs { Get-Service |
where {$_.DependentServices} }
當函式在全域範圍中時,您可以在指令碼、函式以及命令列中使用函式。
函式通常會建立一個範圍。函式中建立的項目 (例如變數) 僅存在於函式範圍。
如需 Windows PowerShell 中範圍的詳細資訊,請參閱 about_Scopes (https://go.microsoft.com/fwlink/?LinkID=113260)。
使用函式尋找和管理函式:磁碟機
Windows PowerShell 中的所有函式和篩選會自動儲存於函式:。此磁碟機由 Windows PowerShell 函式提供者公開。
參照函式:磁碟機時,就在函式後面輸入冒號,就像您參照電腦的 C 或 D 磁碟機一樣。
下列命令會顯示 Windows PowerShell 目前工作階段中的所有函式:
Get-ChildItem function:
函式中的命令會儲存為函式定義屬性中的指令碼區塊。例如,若要顯示 Windows PowerShell 隨附的 Help 函式中的命令,輸入:
(Get-ChildItem function:help).Definition
如需函式:磁碟機的詳細資訊,請參閱函式提供者的說明主題。輸入 "Get-Help Function" 或在 TechNet Library 中進行檢視,位於:https://go.microsoft.com/fwlink/?LinkID=113436。
在新的工作階段中重複使用函式
當您在 Windows PowerShell 命令提示字元中輸入函式時,函式會成為目前工作階段的一部分。到工作階段結束為止可以使用。
若要在所有 Windows PowerShell 工作階段中使用您的函式,將函式新增至您的 Windows PowerShell 設定檔。如需設定檔的詳細資訊,請參閱 about_Profiles (https://go.microsoft.com/fwlink/?LinkID=113729)。
您也可以在 Windows PowerShell 指令碼檔案中儲存您的函式。在文字檔案中輸入您的函式,然後以 .ps1 副檔名儲存檔案。
撰寫函式的說明
Get-Help Cmdlet 會取得函式的說明,以及 Cmdlet、提供者和指令碼。若要取得函式的說明,輸入 Get-Help,後面接續著函式名稱。
例如,若要取得 Get-MyDisks 函式的說明,請輸入:
Get-Help Get-MyDisks
您可以使用下列兩種方法之一來撰寫函式的說明:
函式的以註解為基礎的說明
您可以在註解中使用特殊的關鍵字來建立說明主題。若要建立函式的以註解為基礎的說明,註解必須放在函式主體的開頭或結尾,或是函式關鍵字前面的行。如需以註解為基礎之說明的詳細資訊,請參閱 about_Comment_Based_Help。
函式的以 XML 為基礎的說明
您可以建立以 XML 為基礎的說明主題,例如通常會為 Cmdlet 所建立的說明類型。如果您要將說明主題翻譯成多種語言,就必須使用以 XML 為基礎的說明。
若要將函式與 XML 為基礎的說明主題相關聯,請使用 ExternalHelp 以註解為基礎的說明關鍵字。沒有這個關鍵字,Get-Help 就找不到函式的說明主題,而呼叫函式的 Get-Help 只會傳回自動產生的說明。
如需 ExternalHelp 關鍵字的詳細資訊,請參閱 about_Comment_Based_Help。如需以 XML 為基礎的說明的詳細資訊,請參閱 MSDN 中的<如何撰寫 Cmdlet 說明>。
另請參閱
about_Automatic_Variables
about_Comment_Based_Help
about_Functions_Advanced
about_Functions_Advanced_Methods
about_Functions_Advanced_Parameters
about_Functions_CmdletBindingAttribute
about_Functions_OutputTypeAttribute
about_Parameters
about_Profiles
about_Scopes
about_Script_Blocks
函式 (提供者)