about_Functions
发布日期:2025-01-04 16:09 点击次数:82
主題
about_Functions
簡短描述
描述如何在 Windows PowerShell 中建立和使用函數。
完整描述
函數是具有您所指派之名稱的陳述式清單。當您執行函數時,要輸入函數名稱。清
單中的陳述式就會執行,如同您在命令提示字元輸入陳述式一樣。
與 Cmdlet 一樣,函數可以擁有參數。這些參數可以為具名、位置、切換或動態參
數。可以從命令列或管線讀取函數參數。
函數所傳回的值則可加以顯示、指派給變數,或是傳遞給其他函數或 Cmdlet。
函數的陳述式清單可以包含具有 Begin、Process 和 End 關鍵字的不同類型的陳述
式清單。這些陳述式清單會以不同的方式處理來自管線的輸入。
篩選器是使用 Filter 關鍵字的特殊函數類型。
函數也可以具有與 Cmdlet 相同的功能。您不需使用 C# 程式設計,就可以建立功
能與 Cmdlet 相同的函數。如需詳細資訊,請參閱 about_Functions_Advanced。
語法
函數的語法如下:
function [<範圍:>]<名稱>
[([type]$parameter1[,[type]$parameter2])]
{
param([type]$parameter1 [,[type]$parameter2])
dynamicparam {<陳述式清單>}
begin {<陳述式清單>}
process {<陳述式清單>}
end {<陳述式清單>}
}
函數包括下列項目:
- Function 關鍵字
- 範圍 (選擇性)
- 您選取的名稱
- 任何數量的具名參數 (選擇性)
- 包含在大括號 ({}) 中的一或多個 Windows PowerShell 命令
如需函數中的 Dynamicparam 關鍵字和動態參數的詳細資訊,請參閱
about_Functions_Advanced_Parameters。
簡單函數
函數不必複雜,也可以很有用。下列函數會取得不屬於目前系統的 System 帳戶
的環境變數:
function other_env
{
get-wmiObject win32_environment |
where {$_.username -ne "<System>"}
}
若要執行此函數,請輸入 "other_env"。
您可以建立工具箱,其中納入有用的小函數。請將這些函數新增到 Windows
PowerShell 設定檔,如 about_Profiles 和本主題稍後內容所述。
具有參數的函數
您可以將參數搭配函數使用,包括具名參數、位置參數、切換參數和動態參數等。
如需 函數中的動態參數的詳細資訊,請參閱
about_Functions_Advanced_Parameters。
具名參數
您可以定義任何數量的具名參數。您可以包含具名參數的預設值,如本主題稍後內
容所述。
您可以使用 Param 關鍵字在大括號中定義參數,如下列範例語法所示:
function <name> {
param ([type]$parameter1[,[type]$parameter2])
<statement list>
}
您也可以不用 Param 關鍵字而在大括號外定義參數,如下列範例語法所示:
function <名稱> [([type]$parameter1[,[type]$parameter2])] {
<陳述式清單>
}
這兩種方法之間並無差異, 請依您的喜好選擇。
當您執行函數時,為參數所提供的值會指派給包含參數名稱的變數。該變數的值可
用於函數中。
以下範例示範稱為 Small_files 的函數。這個函數具有 $size 參數。會顯示所有
小於 $size 參數值的檔案,並且排除目錄:
function small_files {
param ($size)
Get-ChildItem c:\ | where {
$_.length -lt $size -and !$_.PSIsContainer}
}
在此函數中,您可以使用 $size 變數,也就是為參數所定義的名稱。
若要使用此函數,請輸入下列命令:
C:\PS> function small_files -size 50
您也可以輸入具名參數的值,而不輸入參數名稱。例如,下列命令的結果,與為
Size 參數命名的命令相同:
C:\PS> function small_files 50
若要定義參數的預設值,請在參數名稱之後輸入等號及值,如下列 Small_files
範例的變化形式所示:
function small_files ($size = 100) {
Get-ChildItem c:\ | where {
$_.length -lt $size -and !$_.PSIsContainer}
}
如果您輸入 "small_files" 而不提供值,則函數會指派 100 給 $size。如果您提
供值,則函數會使用該值。
位置參數
位置參數是不具參數名稱的參數。Windows PowerShell 會使用參數值順序,將每個
參數值與函數中的一個參數建立關聯。
當您使用位置參數時,請在函數名稱之後輸入一或多個值。位置參數值會指派給
$args 陣列變數。接在函數名稱後的值會指派給 $args array, $args[0] 中的
第一個位置。
下列 Extension 函數會將 .txt 副檔名新增到您提供的檔案名稱:
function extension {
$name = $args[0] + ".txt"
$name
}
C:\PS> extension myTextFile
myTextFile.txt
函數可使用一個以上的位置參數。下列範例顯示任何以函數名稱所輸入的值。
function repeat { foreach ($arg in $args) { "輸入為 $arg" } }
C:\PS>repeat 一
輸入為一
C:\PS> repeat 一二三
輸入為一
輸入為二
輸入為三
此函數可用於任何數量的值。此函數可將每個值指派到 $args 陣列中的位置。
切換參數
切換參數是不需要值的參數。相反地,您要輸入函數名稱,後面接著切換參數的
名稱。
若要定義切換參數,請在參數名稱之前指定類型 [switch],如下列範例所示:
function switchExample {
param ([switch]$on)
if ($on) { "開啟" }
else { "關閉" }
}
當您在函數名稱之後輸入 On 切換參數時,該函數會顯示「開啟」。沒有切換參
數時,會顯示「關閉」。
C:\PS> SwitchExample -on
開啟
C:\PS> SwitchExample
關閉
您也可以在執行函數時將布林值指派給切換參數,如下列範例所示:
C:\PS> SwitchExample -on:$true
Switch on
C:\PS> SwitchExample -on:$false
Switch off
經由管線將物件輸出至函數
任何函數都可以使用來自管線的輸入。您可以使用 Begin、Process 和 End 關
鍵字,對函數處理來自管線之輸入的方式進行控管。下列範例語法會示範這三個
關鍵字:
function <名稱> {
begin {<陳述式清單>}
process {<陳述式清單>}
end {<陳述式清單>}
}
Begin 陳述式清單只會在函數起始處執行一次。
Process 陳述式清單會針對管線中的每個命令執行一次。
在 Process 區塊執行時,每個管線物件都會指派到 $_ 自動變數,且一次指派一
個管線物件。
在函數收到管線中的所有物件之後,End 陳述式清單會執行一次。如果沒有使用任
何 Begin、Process 和 End 關鍵字,則所有的陳述式都會被視為 End 陳述式清單。
下列函數會使用 Process 關鍵字。此函數會顯示來自管線的範例:
function pipelineFunction
{
process {"值為:$_"}
}
若要示範此函數,請輸入以逗號建立的數字陣列,如下列範例所示:
C:\PS> 1,2,4 | pipelineFunction
值為:1
值為:2
值為:4
當您在管線中使用函數時,傳入函數的物件會指派給 $input 自動變數。函數會在
從管線傳來任何物件之前,執行具有 Begin 關鍵字的陳述式。而在從管線收到所
有物件之後,函數就會執行具有 End 關鍵字的陳述式。
下列範例示範具有 Begin 和 End 關鍵字的 $input 自動變數。
function PipelineBeginEnd
{
begin {"開始:輸入為 $input"}
end {"結束:輸入為 $input" }
}
如果此函數是藉由管線而執行,則會顯示下列結果:
C:\PS> 1,2,4 | PipelineBeginEnd
開始:輸入為
結束:輸入為 1 2 4
當 Begin 陳述式執行時,函數沒有來自管線的輸入。End 陳述式會在函數具有這
些值之後執行。
如果函數具有 Process 關鍵字,則函數會讀取 $input 中的資料。下列範例具有
Process 陳述式清單:
function PipelineInput
{
process {"正在處理:$_ " }
end {"結束:輸入為:$input" }
}
在此範例中,每個經由管道輸出至函數的物件都會傳送到 Process 陳述式清單。
Process 陳述式會在每個物件上執行,一次執行一個物件。當函數到達 End 關鍵
字時,$input 自動變數是空的。
C:\PS> 1,2,4 | PipelineInput
正在處理:1
正在處理:2
正在處理:4
結束:輸入為:
篩選器
篩選器是在管線中的每個物件上執行的函數類型。篩選器類似於所有陳述式都位於
Process 區塊中的函數。
篩選器的語法如下所示:
filter [<範圍:>]<名稱> {<陳述式清單>}
下列的篩選器會從管線取得記錄項目,然後再顯示整個項目或只顯示項目的訊息部
分:
filter ErrorLog ([switch]$message)
{
if ($message) { out-host -inputobject $_.Message } else
{ $_ }
}
函數範圍
函數會存在於當初建立時所在的範圍。
如果函數是指令碼的一部分,則該函數可提供該指令碼內的陳述式使用。根據預
設,指令碼中的函數不可用於命令提示字元。
您可以指定函數的範圍。例如,在下列範例中,函數會新增到全域範圍:
function global:get-dependentsvs { get-service | where
{$_.dependentservices} }
當函數位於全域範圍時,您可以在指令碼、函數和命令提示字元使用函數。
函數通常會建立範圍。在函數中建立的項目 (例如變數) 只能存在於函數範圍中。
如需 Windows PowerShell 中的範圍的詳細資訊,請參閱 about_Scope。
使用 Function: 磁碟機尋找及管理函數:在 Windows PowerShell 中所有的函數和篩
選器都會自動儲存在 Function: 磁碟機中。這個磁碟機會由 Windows PowerShell
Function 提供者公開。
參考 Function: 磁碟機時,請在 Function 之後輸入冒號,就如同您在參照電腦的
C 或 D 磁碟機時的做法。
下列命令會顯示 Windows PowerShell 目前工作階段中的所有函數:
C:\PS> dir function:
函數中的命令會以指令碼區塊的形式儲存在函數的定義屬性中。例如,若要顯示
Windows PowerShell 所隨附的 Help 函數中的命令,請輸入:
(dir function:help).definition
如需 Function: 磁碟機的詳細資訊,請參閱 Function。
在新的工作階段中重複使用函數
在 Windows PowerShell 命令提示字元輸入函數時,該函數就會變成目前工作階段的
一部分, 在該工作階段結束之前都可以使用。
若要在所有的 Windows PowerShell 工作階段中使用某函數,請將其新增到
Windows PowerShell 設定檔。如需設定檔的詳細資訊,請參閱 about_Profiles。
您也可以將函數儲存在 Windows PowerShell 指令檔中。請在文字檔中輸入函數,
然後以 .ps1 副檔名儲存該檔案。
撰寫函數的說明
Get-Help Cmdlet 會取得函數以及 Cmdlet、提供者和指令碼的說明。若要取得函數
的說明,請輸入 Get-Help,後面接著函數名稱。
例如,若要取得 MyDisks 函數的說明,請輸入:
get-help MyDisks
您可以使用下列兩種方法之一來撰寫函數的說明:
-- 以註解為基礎的函數說明
您可以在註解中使用特殊的關鍵字來建立說明主題。若要建立以註解為基礎的函
數說明,註解必須放在函數主體的起始或結尾處,或放在函數關鍵字之前的行
中。如需以註解為基礎之說明的詳細資訊,請參閱 about_Comment_Based_Help。
-- 以 XML 為基礎的函數說明
您可以建立以 XML 為基礎的說明主題,例如通常會為 Cmdlet 所建立的說明類
型。如果您要將說明主題當地語系化為多種語言,就必須使用以 XML 為基礎的說
明。
若要將函數與以 XML 為基礎的說明主題建立關聯,請使用 .ExternalHelp 說明
註解關鍵字。如需 ExternalHelp 關鍵字的詳細資訊,請參閱
about_Comment_Based_Help。如需以 XML 為基礎之說明的詳細資訊,請參閱
MSDN 中的<如何撰寫 Cmdlet 說明>。
請參閱
about_Automatic_Variables
about_Comment_Based_Help
about_Functions_Advanced
about_Functions_CmdletBindingAttribute
about_Parameters
about_Profiles
about_Scopes
about_Script_Blocks
Function (提供者)