Function Powershell函数elseif语句不工作

Function Powershell函数elseif语句不工作,function,powershell,if-statement,Function,Powershell,If Statement,我有一个powershell函数,它没有按应有的方式工作。它应该将$prm中提供给它的选项限制为最多5个。超过5次时,应提醒用户。如果在字符串中传递0,则默认为null 有人能告诉我需要做什么来解决这个问题吗: Function GetListValues($prm, $charCount){ $buildStr="Call db.Fruit(" #no selection if ($charCount -eq 0 ){ $buildStr = $buildStr + "NUL

我有一个powershell函数,它没有按应有的方式工作。它应该将$prm中提供给它的选项限制为最多5个。超过5次时,应提醒用户。如果在字符串中传递0,则默认为null

有人能告诉我需要做什么来解决这个问题吗:

Function GetListValues($prm, $charCount){ 

$buildStr="Call db.Fruit(" 

#no selection
if ($charCount -eq 0 ){ 
    $buildStr = $buildStr + "NULL,NULL,NULL,NULL,NULL);"
    write $buildStr
}elseif($charCount -ge 1 -and $charCount -le 4 ){

#selections made with then 5 parameter range

$arr = $prm.split(",");
if ($arr[0]) { $buildStr = $buildStr  + $arr[0] + "," } else { $buildStr = $buildStr + "Null," }
if ($arr[1]) { $buildStr  = $buildStr + $arr[1] + "," } else { $buildStr = $buildStr + "Null," }
if ($arr[2]) { $buildStr  = $buildStr + $arr[2] + "," } else { $buildStr = $buildStr + "Null," }
if ($arr[3]) { $buildStr  = $buildStr + $arr[3] + "," } else { $buildStr = $buildStr + "Null," }
if ($arr[4]) { $buildStr  = $buildStr + $arr[4] + ");" } else {$buildStr =  $buildStr + "Null);" }

write $buildStr


}else{
# too many selections

[System.Windows.MessageBox]::Show('Too many selections! A maximum of 5 only!')


}


}
$prm = "'Apple','Orange','Pear','Banana','Grapes'"
$charCount = ($prm.ToCharArray() | Where-Object {$_ -eq ','} | Measure-Object).Count
GetListValues $prm, $charCount
指出参数传递语法的直接问题

此外,正如他所建议的,您不需要确定函数外部的元素计数——让函数本身处理这一点更容易、更健壮。 下面是对函数的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[]]
允许您(a)单独传递列名,以及(b)轻松访问列名计数,并允许您通过
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稍后提出要求),其:

  • 允许将最大列数作为参数传递

  • 将列名作为带有嵌入引号的单个字符串传递(例如,
    “‘苹果’、‘橙色’、‘梨’、‘香蕉’、‘葡萄’”

电话示例:

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)

您的问题在于测试代码,而不是函数。对于powershell,您只使用空格来分隔参数,而不使用逗号

所以如果你把测试改为

GetListValues$prm$charCount

然后代码就工作了

您可以忽略我之前的评论,因为我假设您的$charCount值被设置为元素数。但仔细观察,我发现您只是在计算逗号的数量,因此元素的数量将是#逗号+1(只要元素>1)


顺便说一句,$charCount有点多余,因为函数可以自己解决这个问题,并且会使函数更具弹性,因为它可以消除调用代码传递不一致值的可能性。

感谢Dean提供的提示。我不是一个喜欢权力地狱的人。我更多的是一个javascript的家伙和代码的方式。是的,关于计算$charCount的函数,您是对的。我只是把它搬出去,试图简化和隔离我的错误。
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)