您可能已经探索了 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/