Полезный ответ DeanOC указывает на вашу непосредственную проблему с синтаксисом передачи аргументов.
Кроме того, как он предполагает, вам не нужно определять количество элементов вне функции - это прощеи более надежным, чтобы позволить самой функции справиться с этим.Вот идиоматическая переформулировка PowerShell вашей функции, которая делает именно это:
function GetListValues {
param(
[ValidateCount(0,5)] # Allow between 0 and 5 values.
[string[]] $Columns
)
# Create a 5-element array filled with the input column names
# and 'Null' for any remaining elements.
$allColumns = New-Object string[] 5
for ($i = 0; $i -lt $allColumns.Count; ++$i) {
$allColumns[$i] = if ($i -lt $Columns.Count) { $Columns[$i] } else { 'Null' }
}
# Use string expansion (interpolation) to construct the output string.
"Call db.Fruit($($allColumns -join ','))"
}
Определение параметра как [string[]]
позволяет вам (а) передавать имена столбцов индивидуально и (б) легко дает вам доступ ких количество и позволяет ограничить допустимый диапазон имен столбцов с помощью атрибута ValidateCount
.
Поэтому вы можете вызвать приведенную выше функцию следующим образом:
# Pass 5 column names.
# Note that with the simple names at hand you needn't even quote them.
PS> GetListValues Apple, Orange, Pear, Banana, Grapes
Call db.Fruit(Apple,Orange,Pear,Banana,Grapes)
# Pass no column names at all.
PS> GetListValues
Call db.Fruit(Null,Null,Null,Null,Null)
# Pass too many names -> ValidateCount triggers an error.
PS> GetListValues Apple, Orange, Pear, Banana, Grapes, TooMuch
GetListValues : Cannot validate argument on parameter 'Columns'.
The parameter requires at least 0 value(s) and no more than 5 value(s)
- 6 value(s) were provided.
ВариантРешение (запрошенное позже OP), что:
позволяет пройти макс.количество столбцов в качестве параметра
передает имена столбцов в виде одной строки со встроенными кавычками (например, "'Apple', 'Orange', 'Pear', 'Banana', 'Grapes'"
).
function GetListValues {
param(
[string] $ColumnList,
[int] $MaxColumnCount
)
# Split something like "'Apple', 'Orange', 'Pear', 'Banana', 'Grapes'"
# into an array of tokens.
$Columns = $ColumnList -split "[, ']" -ne ''
if ($Columns.Count -gt $MaxColumnCount) { Throw "Too many columns passed." }
# Create an N-element array filled with the input column names
# and 'Null' for any remaining elements.
$allColumns = New-Object string[] $MaxColumnCount
for ($i = 0; $i -lt $allColumns.Count; ++$i) {
$allColumns[$i] = if ($i -lt $Columns.Count) { $Columns[$i] } else { 'Null' }
}
# Use string expansion (interpolation) to construct the output string.
"Call db.Fruit($($allColumns -join ','))"
}
Пример звонков:
PS> GetListValues "'Apple', 'Orange', 'Pear', 'Banana', 'Grapes'" 5
Call db.Fruit(Apple,Orange,Pear,Banana,Grapes)
PS> GetListValues "" 3
Call db.Fruit(Null,Null,Null)