腳本與模組
一行一行在終端機輸入的指令,關掉視窗就沒了。把它們存成 腳本(.ps1 檔)就能重複執行、分享給別人;把常用的函式打包成 模組,就能在任何腳本裡載入使用。本頁說明如何撰寫、執行腳本,以及如何使用別人寫好的模組。
撰寫並執行腳本
用 VS Code 建立 hello.ps1:
在終端機切到該資料夾後執行:
為什麼要加 ./
PowerShell 為了安全,不會直接從目前資料夾執行程式,必須明確寫出路徑。在 Windows 上如果看到「無法載入,因為這個系統上已停用指令碼執行」,請看 安裝與環境 的執行原則。
腳本的實用習慣
#Requires -Version 7.0 # 版本不符就直接拒絕執行,並顯示清楚訊息
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$Path
)
$ErrorActionPreference = 'Stop' # 出錯就停下來(見「錯誤處理」)
# $PSScriptRoot 是這支腳本所在的資料夾,用它組出相對於腳本的路徑,
# 不論從哪個目錄執行都不會找錯檔案
$configFile = Join-Path $PSScriptRoot 'config.json'
- 腳本開頭的
param()決定它接受哪些參數,寫法與 函式 完全相同。 - 路徑組合用
Join-Path,不要手動串\或/,這樣在 Windows、macOS、Linux 都能運作。
載入函式:dot-source
想把另一個 .ps1 檔裡的函式載入目前的腳本,用點號加空格再加路徑(dot-sourcing):
函式越多,這種做法越難維護。這時就該做成模組。
模組(Module)
模組是打包好的一組函式、cmdlet 與變數,用 Import-Module 載入。PowerShell 內建的 cmdlet 也是分屬在各個模組裡。
Get-Module -ListAvailable # 列出電腦上可用的模組
Get-Command -Module Microsoft.PowerShell.Utility # 某模組提供的指令
Import-Module ImportExcel # 載入已安裝的模組(安裝見下方;多數情況下用到模組指令時會自動載入)
自己做一個簡單的模組
把函式放進副檔名為 .psm1 的檔案,就是一個最簡單的模組:
# MyTools.psm1
function Get-Greeting {
param([string]$Name = 'World')
"Hello, $Name!"
}
Export-ModuleMember -Function Get-Greeting
Export-ModuleMember 指定哪些函式對外公開,沒列出的視為模組內部使用。要分享給其他人使用,可再加上描述模組資訊的 .psd1 資訊清單,本站不深入。
從 PowerShell Gallery 安裝模組
PowerShell Gallery 是官方的模組與腳本庫,數以千計的社群與廠商模組都可以直接安裝:
# 安裝到目前使用者,不需要系統管理員權限
Install-Module -Name ImportExcel -Scope CurrentUser
# 更新與移除
Update-Module -Name ImportExcel
Uninstall-Module -Name ImportExcel
PowerShell 7.4 起內建更新的 Microsoft.PowerShell.PSResourceGet 模組,提供 Install-PSResource、Find-PSResource 等指令,用途與上面相同,未來會逐漸取代 Install-Module。
安裝前先確認來源
Gallery 上任何人都能發布模組。安裝前看一下作者、下載次數與專案網址,優先選擇 Microsoft 與知名廠商發布的模組。
設定檔(Profile)
每次開啟 PowerShell 都會自動執行一支 profile 腳本,適合放你常用的別名、函式與提示字元設定:
$PROFILE # 顯示 profile 的路徑
New-Item -Path $PROFILE -ItemType File -Force # 建立(若不存在)
code $PROFILE # 用 VS Code 開啟編輯
推薦影音
進階腳本技巧:函式、模組與簽章
簡述:John Savill 的 PowerShell Master Class 進階腳本單元(約 46 分鐘),說明函式、自建模組,以及腳本簽章,對應本頁的「模組」與 函式。錄於 2019 年,觀念在 PowerShell 7 仍適用。