PowerShell 管道参数:如何创建适用于管道的函数

您可能已经探索了 PowerShell 管道的工作原理,以及内置 cmdlet 如何将数据从一个命令传递到另一个命令。但您知道吗,您可以创建自己的自定义函数,也可以使用管道?是的!通过 参数绑定,您的函数可以像内置 cmdlet 一样,无缝地接受来自管道的数据。

本教程将指导您为自定义函数赋予管道的强大功能,改变您自动化和构建 PowerShell 脚本的方式。

与其依赖循环或手动输入,解锁您脚本中的新效率和灵活性!

启用管道输入使用 ValueFromPipeline

为了让您的函数接收来自管道的信息,您必须配置一个或多个参数以接受它。您将配置参数以使用 ValueFromPipelineValueFromPipelineByPropertyName 属性。

让我们开始设置一个函数,该函数在多台计算机上安装软件,以便在不使用循环的情况下将计算机名称数组传递给它。

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文件包含ComputerNameVersion字段。

为了演示通过属性名称绑定,请先保存一个包含这些属性的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

更新函数以接受VersionComputerName作为属性名称。

使用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

每行的ComputerNameVersion字段绑定到函数中相应的参数。这种方法可以轻松实现跨多台计算机进行软件安装的批量处理,并实现版本控制。

结论

在本教程中,您学习了如何在PowerShell函数中启用管道支持,使其更加灵活和强大。现在,您可以设计自定义函数,无缝地接受来自管道的数据,类似于内置的cmdlet。

通过启用管道的函数,您可以更精细地控制数据输入,简化脚本设计,提高可读性。

在继续使用PowerShell时,请考虑整合这些技术,编写高效、支持管道的函数。让您的脚本更具适应性,有效地自动化任务!

Source:
https://adamtheautomator.com/powershell-pipeline-parameters/