2023年11月19日 星期日

PowerShell如何把 高級函式ps1 當作字串執行

PowerShell如何把 高級函式ps1 當作字串執行

一般來說如果在ps1檔案開頭加上 [CmdletBinding()] 可以把檔案升級成高函式,也就是那個檔案本身會當作是一個函式來看待

比如說這樣一個檔案

TestFunction.ps1

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [string]$InputString
)
Write-Host by PSVersion:: $PSVersionTable.PSVersion
Write-Output "输入的字符串是: $InputString"

可以在終端機如此使用該檔案

.\TestFunction.ps1 Test

這樣就能直接呼叫這個檔案了並執行了



那如果不把它當作當按執行而是要當作文字呢,考慮到下面的範例文字

$PwshScript = @'
[CmdletBinding()]
param(
    [Parameter(Mandatory=$true)]
    [string]$InputString
)
Write-Host by PSVersion:: $PSVersionTable.PSVersion
Write-Output "输入的字符串是: $InputString"
'@

該如何執行這串代碼並帶入參數的方法是

Invoke-Expression "&{ $PwshScript } AAA"

如此一來就可以不把它當作檔案執行,而是用讀取的方式執行字串了




這個有個例子是 PowerShell 的線上安裝腳本,蠻精妙的方式
官方說明網址是:PowerShell/tools/install-powershell.ps1-README.md · GitHub

實際應用的案例是 (PowerShell自動更新的ps1腳本)

iex "& { $(irm aka.ms/install-powershell.ps1) } -UseMSI"

如此就能把參數帶進去執行了,這會自動下在最新版本 msi 到暫存並自動打開



沒有留言:

張貼留言