Параметры конвейера PowerShell: Как создавать функции, готовые к работе в конвейере

Вы, возможно, исследовали, как работает конвейер PowerShell и как встроенные команды передают данные от одной команды к другой. Но знали ли вы, что вы можете создавать свои собственные пользовательские функции, которые также используют конвейер? Да! С помощью связывания параметров ваши функции могут работать так же, как встроенные команды, бесшовно принимая данные из конвейера.

Этот учебник поможет вам оснастить ваши пользовательские функции мощью конвейера, трансформируя ваш подход к автоматизации и структуре ваших скриптов 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, сделав их более гибкими и мощными. Теперь вы можете создавать пользовательские функции, которые легко принимают данные из конвейера, аналогично встроенным командлетам.

Используя функции, поддерживающие конвейер, вы получаете более тонкий контроль над вводимыми данными, упрощая проектирование сценария и улучшая его читаемость.

Продолжая работу с PowerShell, рассмотрите возможность интеграции этих техник для написания эффективных функций, готовых к работе с конвейером. Сделайте ваши сценарии более адаптивными и эффективными в автоматизации задач!

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