Как я могу иметь несколько параметров (хотя бы с одним обязательным) в функции?

#powershell

#powershell

Вопрос:

Я хочу создать функцию foo , для которой требуется добавить хотя бы одну строку. Можно добавить больше (неуказанное количество), но это не обязательно.

Я создал функцию, похожую на эту:

 function foo {
   [CmdLetBinding()]
   param(
       [Parameter(Mandatory=$true)][string]$param1
   )

   if ($args -ne $null) {
       $string = $param1   " "   $($args -join ' ')
   } else {
       $string = $param1
   }

   Write-Output $string
   
}
  

Однако выполнение foo a b c (ожидаемый результат a b c ) завершается неудачей с

 foo : A positional parameter cannot be found that accepts argument 'b'.
At line:1 char:1
  foo a b c
  

Что мне нужно изменить, чтобы этот код заработал?

Комментарии:

1. Вы ожидаете, что powershell объединит / конкатенирует отдельные аргументы в одну строку, или вы заинтересованы в использовании их в виде массива строк внутри функций?

Ответ №1:

Чтобы неявно привязать разрозненные аргументы к именованному параметру, вам нужно установить ValueFromRemainingArguments флаг в [Parameter()] атрибуте целевого параметра:

 param(
    [Parameter(Mandatory=$true, ValueFromRemainingArguments=$true)][string]$param1
)
  
 PS C:> foo a b c
a b c
  

Комментарии:

1. Спасибо за быстрый ответ. Это решило мою проблему. Вся слава вам, добрый сэр! 😉

2. learn.microsoft.com/en-us/powershell/module /… для получения обширного списка.

3. @ITM Я также обновил ответ ссылкой на about_Functions_Advannced_Parameters документ 🙂