Обработка конвейера Powershell - $ _ работает, но $ ParamName не работает - PullRequest
1 голос
/ 25 февраля 2020

У меня проблемы с пониманием этого поведения ...

С учетом такого скрипта Powershell (дополненного реальным кодом) ...

[cmdletbinding(DefaultParameterSetName="Default")]
param (
    [cmdletbinding()]

    [Parameter( Mandatory=$true, 
                ValueFromPipeline = $true,
                ParameterSetName="Default")]
    [Parameter(Mandatory=$true, ParameterSetName="Azure")]
    [Parameter(Mandatory=$true, ParameterSetName="AWS")]                
    [Alias("Server")]
    [String[]] $SqlServer,

    # other parameters
)

BEGIN {} 
PROCESS {


    <# *************************************
    PROCESS EACH SERVER IN THE PIPELINE
    **************************************** #>
    Write-Debug "Processing SQL server $_..."
        # GET SMO OBJECTS
    $Error.Clear()
    try {
        # GET CONNECTION TO TARGET SERVER
        $_svr = _get-sqlconnection -Server $_ -Login $DatabaseLogin -Pwd $Password

        # PROCESS DATABASES ON SERVER
    } catch {

        $Error

    }
} END {}

Я понимаю, что $ _ является текущим объектом в конвейере, и я думаю, что понимаю, почему «Write-Host $ _» работает. Но почему «Write-Host $ InputVariable» выводит пустую строку?

Как мне определить параметр, чтобы я мог передавать значения как через конвейер, так и в виде именованного параметра (то есть - ./script.ps - InputVariable "что-то")?

Это работает: "someservername" | ./script Это не работает: ./script -SqlServer "someservername"

Спасибо.

1 Ответ

3 голосов
/ 25 февраля 2020

$_ заполняется только при работе с входом конвейера.

Если вы хотите принять оба:

"string","morestrings" | ./script.ps1
# and
./script.ps1 -MyParameter "string","morestrings"

..., тогда используйте следующий шаблон:

[CmdletBinding()]
param(
    [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
    [string[]]$MyParameter
)

process {
    foreach($paramValue in $MyParameter){
        Write-Host "MyParameter: $paramValue"
    }
}
...