【问题标题】:How to only allow array parameter of a certain length如何只允许一定长度的数组参数
【发布时间】:2022-11-19 04:04:45
【问题描述】:

我目前正在研究我的 PowerShell 模块的高级功能,并且要解决一个我认为在课堂上没有适当涉及的问题。

这里说的问题。

使用 Begin、Process 和 End 创建一个带有两 (2) 个参数的高级函数。第一个参数是至少十 (10) 个整数的数组,第二个参数是单个整数。在数组参数中搜索单个整数参数的每次出现,然后返回数组中所有元素的总和,不包括单个整数参数的每次出现。

我无法弄清楚“至少十(10)个整数”部分。

这是我写的脚本。

function get-multisum
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true)]
        [ValidateLength(10)]
        [array]$array,
        [Parameter(Mandatory=$true)]
        [int32]$num
    )
    Begin {
        $total = 0
    }
    Process {
        foreach($i in $array)
        {
            if($i -ne $num)
            {
                $total = $total + $i
            }
            else {
                continue
            }
        }
    }
    End {
        return $total
    }
}

虽然我知道这可以写成...

function problem($array, $num)
{
    foreach($i in $array)
    {
        if($i -ne $num)
        {
            $total = $total + $i
        }
    }   
    return $total
}

该问题专门提示了一个高级功能。除了验证至少包含 10 个元素的数组之外,我的脚本按预期工作。我尝试了 [ValidateLength(10)] 但没有用。我不想在代码以一些 if 语句或你有什么开始之后运行检查。我很好奇是否一开始就只允许有效参数。提前致谢!

【问题讨论】:

  • ValidateLength 对于字符串类型的参数非常有用。不幸的是不适用于数组

标签: arrays powershell parameters


【解决方案1】:

他们可能采用的解决方案可能与此不同,但您可以使用 [ValidateCount()] 属性验证传递给参数的项目数:

Function Test {
[CmdletBinding()]
    Param(
        [parameter()]
        [ValidateCount(10,[int]::MaxValue)]
        [int[]]$IntArray
    )
    $IntArray
}

在这里,10 是传递给该参数的最小值,[int]::MaxValue 是它可以传递的最大值。

所以以下应该失败:

test -IntArray (1..9) # fails

虽然这通过了:

test -IntArray (1..10)

有点“作弊”的是使用[ValidateScript({}),您可以在其中实现相同的逻辑,或者您自己的逻辑;)。

【讨论】:

  • 使用ValidateScript会更难做到(甚至不确定是否可能)因为每个元素都被枚举了:)我认为删除答案的最后一部分是安全的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 2015-01-20
  • 2011-09-15
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多