如何使用 PowerShell 函數

  1. PowerShell 中函數與 Cmdlet 的區別
  2. PowerShell 中函數的介紹
  3. 為 PowerShell 中的函數添加參數
  4. 在 PowerShell 中創建函數的簡單參數
如何使用 PowerShell 函數

當我們編寫 PowerShell 腳本時,有許多選擇。例如,我們可以為任務編寫一千行代碼,全部放在一個代碼塊中。

然而,這樣會很複雜。因此,我們應該編寫 PowerShell 函數。

PowerShell 函數顯著提高了我們代碼的可用性和可讀性,讓工作變得更加簡單。在本文中,我們將學習如何編寫函數,添加和管理我們函數的參數,並設置函數以接受管道輸入。

PowerShell 中函數與 Cmdlet 的區別

PowerShell 函數的概念可能聽起來很熟悉,因為它聽起來像原生 PowerShell Cmdlet。像 Write-HostStart-Service 這樣的命令,與函數非常相似。

然而,Cmdlet 是解決單一問題的命名代碼片段,並不易於自定義。Cmdlet 與函數之間的區別在於這些結構的構造方式。

我們可以使用 Get-Command Cmdlet 和其 -CommandType 參數來查看哪些命令是 Cmdlet 和函數。

Get-Command -CommandType Function

上述命令返回當前加載到我們 PowerShell 會話中的所有函數或可用於 PowerShell 的模塊。

PowerShell 中函數的介紹

我們使用 function 關鍵字來定義函數,後面跟著描述性的用戶自定義名稱和一組大括號。在大括號內是我們希望 PowerShell 執行的腳本塊。

下面我們可以看到一個主要函數及其執行。該函數名為 Install-Software,使用 Write-Host 在控制台顯示輸出消息(主要用於模擬安裝)。

一旦定義,我們就可以使用這個函數的名稱來執行其腳本塊內的代碼。

示例代碼:

function Install-Software {
    Write-Host 'The software has been installed.'
}

Install-Software

輸出:

The software has been installed.

PowerShell 中使用動詞-名詞語法的函數命名約定最佳實踐

函數的名稱非常重要。我們可以隨意命名我們的函數,但名稱應始終描述函數的作用。

PowerShell 中的函數命名約定最佳實踐是動詞-名詞語法。

我們應該始終以動詞開頭函數名稱,然後跟一個破折號和一個名詞。使用 Get-Verb Cmdlet 查找可用的動詞列表。

在 PowerShell 中定義一個高級函數

本教程假設我們已將前面的代碼直接複製並粘貼到 PowerShell 控制台中。在本節中,我們也可以在腳本中定義函數。

我們在上一節中使用了一個小函數,因此在控制台中定義它並不是大問題。儘管如此,大多數時候,我們將有更大的函數。

因此,在腳本或模塊中定義這些函數會更容易,然後調用該腳本或模塊將函數加載到內存中。

正如我們可能想像的,每次我們想調整其功能時重複輸入較大函數可能會令人困惑。

為 PowerShell 中的函數添加參數

函數可以有任意數量的參數。當我們創建函數時,我們會有選擇來包含參數並決定這些參數的工作方式。

參數可以是可選的或必需的,並且可以強制接受有限列表的某個參數或接受任何東西。

例如,通過 Install-Software 函數安裝的虛構軟件可能在之前有許多可能的版本。但目前,Install-Software 函數並不提供用戶指定要安裝的版本的方式。

如果我們是唯一使用該函數的人,我們可以在每次需要特定版本時更改其內部代碼,但這將花費大量時間。這種方法也容易出錯,而我們希望其他人能夠使用我們的代碼。

將參數引入函數使其具有變化性。正如變量使我們能夠編寫可以處理多個相同情況版本的腳本,參數將使我們能夠編寫一個以多種方式執行單一操作的函數。

在這種情況下,我們希望它能安裝相同軟件的版本,並在許多計算機上執行。

首先,讓我們為函數添加一個參數,以便用戶或我們指定要安裝的版本。

在 PowerShell 中創建函數的簡單參數

在函數上定義參數需要一個參數塊。參數塊保存函數的所有參數。

使用 param 關鍵字定義一個參數塊,後面跟著括號,如下所示。

示例代碼:

function Install-Software {
    [CmdletBinding()]
    param()

    Write-Host 'The software has been installed.'
}

此時,我們的函數的實際功能沒有任何改變。我們只是安裝了管道,為參數準備了函數。

一旦我們添加了 param 塊,我們就可以通過將參數放入其括號內來創建參數,如下所示。

示例代碼:

function Install-Software {
    [CmdletBinding()]
    param(
        [Parameter()]
        [string] $Version
    )

    Write-Host "The software version $Version has been installed."

}

在上面的 param 塊內,我們首先定義 Parameter 塊。使用 Parameter() 塊將參數變成 “高級參數”。

像這樣的空 param 塊不做任何事情,但卻是必需的;我們將在下一節解釋如何使用它。

讓我們專注於參數名稱前面的 [string] 類型。我們通過在參數變量名稱之前將參數的類型放在方括號內來強制轉換參數。

PowerShell 總是將值默認為字符串。上面,傳遞到變量 $Version 的任何東西都將始終被視為字符串。

我們還將 $Version 添加到 Write-Host 語句中。然後,當我們運行帶有 Version 參數的 Install-Software 函數並傳遞一個版本號時,我們應該會看到顯示該版本號的消息。

示例代碼:

Install-Software -Version 2

輸出:

The software version 2 has been installed.
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相關文章 - PowerShell Function