Список значений по умолчанию для параметра конвейера в Powershell - PullRequest
1 голос
/ 21 мая 2010

У меня есть скрипт Powershell, который считывает значения из конвейера:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s
)

PROCESS {
    echo "* $s"
}

Работает просто отлично:

PS> my.ps1 foo
* foo

Я бы хотел, чтобы в скрипте был список значений по умолчанию, так как при наиболее распространенном использовании всегда будут использоваться одни и те же значения, и хранение их по умолчанию будет наиболее удобным Я сделал обычное задание:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = 'bar'
)

PROCESS {
    echo "* $s"
}

Опять же, отлично работает:

PS> my.ps1
* бар
PS> my.ps1 foo
* foo

Однако, устанавливая по умолчанию список, я получаю что-то совершенно разумное, но не совсем то, что хочу:

PARAM (
    [Parameter(ValueFromPipeline = $true)] 
    $s = @('bar', 'bat', 'boy')
)

PROCESS {
    echo "* $s"
}

Результат:

PS> my.ps1
* бар летучая мышь мальчик

Я ожидал:

PS> my.ps1
* бар
* летучая мышь
* мальчик

Как я могу получить один вызов в цикл обработки для каждого значения по умолчанию? (Это несколько отличается от одного вызова Process и помещения текущего тела в большой цикл foreach над $ s).

Ответы [ 2 ]

6 голосов
/ 21 мая 2010

Это работает, как и следовало ожидать, как более четко показано в этом изменении в вашем коде:

PARAM ( 
    [Parameter(ValueFromPipeline = $true)]  
    $s = @('bar', 'bat', 'boy') 
) 

PROCESS { 
    $s | %{$_ + " is a " + $_.GetType().Name}
}

Что вас смущает, так это особенность PowerShell, в которой он сглаживает массивы, когда их просят отобразить их в строку, например:

PS> $arr = 1,2,3
PS> "$arr"
1, 2, 3
PS> $OFS = ', '
PS> "$arr"
1, 2, 3

По умолчанию PowerShell отображает каждый элемент массива один за другим, используя разделитель пробелов. Вы можете изменить разделитель по умолчанию на любую строку, установив переменную разделителя поля вывода $OFS.

0 голосов
/ 22 мая 2010

Вместо:

PROCESS { 
    echo "* $s" 
}

do:

PROCESS { 
    $s | foreach-object {
       "* $_"
    }
}

и попытайтесь избавиться от привычки использовать echo (запись-вывод), поскольку все, что не было зафиксировано, будет выводитьсявы.

...