您可能已經探索了 PowerShell 管道的工作原理,以及內建 cmdlet 如何將數據從一個命令傳遞到另一個命令。但您知道您可以創建自己的自定義函數也使用管道嗎?是的!透過 參數綁定,您的函數可以像內建 cmdlet 一樣,無縫地接受來自管道的數據。
本教程將指導您為自定義函數裝備管道的力量,改變您自動化和結構化 PowerShell 腳本的方式。
與其依賴循環或手動輸入,不如解鎖您腳本的新效率和靈活性!
啟用管道輸入與 ValueFromPipeline
為了讓您的函數接收來自管道的信息,您必須配置一個或多個參數來接受它。您將配置參數以使用 ValueFromPipeline
或 ValueFromPipelineByPropertyName
屬性。
讓我們開始設置一個在多台計算機上安裝軟件的函數,以便在不使用循環的情況下將計算機名稱的數組傳遞給它。
將 ValueFromPipeline
屬性添加到 ComputerName
參數,允許每個進入的管道對象被視為 ComputerName
參數。
使用此設置,PowerShell 將每個進入的管道對象綁定到 $ComputerName
。
function Install-Software { param( [Parameter(Mandatory)] [ValidateSet(1,2)] [int]$Version, [Parameter(Mandatory, ValueFromPipeline)] [string]$ComputerName ) process { Write-Host "I installed software version $Version on $ComputerName. Yippee!" } }
現在,使用管道將計算機名稱的數組傳遞給該函數。
$computers = @("SRV1", "SRV2", "SRV3") $computers | Install-Software -Version 1
沒有process
區塊,該函數將只處理最後一個項目。process
區塊使函數能夠獨立處理陣列中的每個項目。
根據屬性名稱綁定使用ValueFromPipelineByPropertyName
也許您的管道物件中有多個屬性需要與函數的參數相匹配。如果是這樣,讓我們假設CSV文件包含ComputerName
和Version
字段。
為了演示根據屬性名稱進行綁定,首先保存一個包含這些屬性的CSV文件:
@( [pscustomobject]@{'ComputerName' = 'SRV1'; 'Version' = 1} [pscustomobject]@{'ComputerName' = 'SRV2'; 'Version' = 2} [pscustomobject]@{'ComputerName' = 'SRV3'; 'Version' = 2} ) | Export-Csv -Path C:\Scripts\software_installs.csv -NoTypeInformation
更新函數以接受Version
和ComputerName
作為屬性名稱。
使用ValueFromPipelineByPropertyName
,函數將每個物件(例如從CSV導入的物件)的屬性與函數中的參數相匹配。
function Install-Software { param( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [ValidateSet(1,2)] [int]$Version, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string]$ComputerName ) process { Write-Host "I installed software version $Version on $ComputerName. Yippee!" } }
現在,使用Import-Csv
導入文件,並將每個物件傳輸到Install-Software
。
Import-Csv -Path C:\Scripts\software_installs.csv | Install-Software
每一行的ComputerName
和Version
字段都將綁定到函數中相應的參數。這種方法使跨多台計算機進行軟件安裝並進行版本控制的批量處理變得輕鬆。
結論
在本教程中,您學會了如何在 PowerShell 函數中啟用管道支持,使其更加多功能和強大。您現在可以設計自定義函數,無縫接收來自管道的數據,類似於內置的 cmdlet。
使用啟用管道的函數,您可以更好地控制數據輸入,簡化腳本設計並提高可讀性。
當您繼續使用 PowerShell 時,考慮整合這些技術來編寫高效且支持管道的函數。讓您的腳本更具適應性和有效性,以自動化任務!
Source:
https://adamtheautomator.com/powershell-pipeline-parameters/