Powershell - 来自用户输入的数组范围

时间:2011-09-29 19:11:01

标签: powershell powershell-v2.0

获取数组范围的用户输入的最简单方法是什么。

例如:

function MyArrayOfMachines {
[CmdletBinding()]
param(
    [parameter(Mandatory=$true)][string]$Machine
    # What should I assign the $Range variable as?
    )
 # Hardcoded range. User should be able to enter the range
 $Range = 2..5
 for ($i=0; $i -lt $array.length; $i +=1)
 {
   $result = $array[$i]
   $output = $machine+$result
   $output
 }
}

上述函数应将输入作为机器名称和数组范围。现在我的数组范围是硬编码的。当我在用户提示中将$ Range分配为[Array] $ Range时,会出现$ Range [0]等提示。但我希望用户输入范围。

5 个答案:

答案 0 :(得分:4)

这不行吗?除非我误解了你的问题......

function test($range){

$range

}

test -range (1..5)

答案 1 :(得分:2)

您也可以将范围作为字符串接受并自行解析:

   function Test
    {
    param($range)

    if($range -is [String])
        {
        [int]$start, [int]$end = $range.split('.', [StringSplitOptions]::RemoveEmptyEntries)
        $start..$end
        }
    else
        {
        $range
        }
    }

if / else的原因是用户传递实际范围的情况,如manojlds回答,而不是要解析的字符串(如1..5)。这意味着你不能强烈地输入参数。

答案 2 :(得分:1)

将它设为两个参数:

function test{
    param ( [int]$st,
            [int]$end)

    $Range = $st..$end
    $Range
}

test 1 5

如果他们输入范围的开头和结尾,您可以使用它在函数中动态创建它。

修改

要从字符串中获取范围,请尝试:

function test{
    param ($Range)

    $NewRange = $Range.substring(0,($Range.indexof('.')))..$Range.substring(($Range.lastindexof('.') + 1))
    $NewRange
}

test 1..5

答案 3 :(得分:0)

我同意@manojlds,范围应该作为数组传入。解析字符串会限制用户可以输入的内容。通过使用[int[]],您可以强制用户指定整数数组。这也允许用户指定一个破碎的范围,例如((2..4)+(6..12)),在解析字符串时更难以允许。

在您的示例中,我不确定$array的来源,您只需要一行来返回计算机器名称。

function MyArrayOfMachines {
    param(
    [parameter(mandatory=$true)]
    [string] $machine,

    [parameter(mandatory=$true)]
    [int[]] $range
    )

    foreach($n in $range) {
        $machine+$n
    }
}

您可以创建一个机器名称

MyArrayOfMachines Laptop 1

一系列机器,

MyArrayOfMachines Workstation (2..10)

或非连续的机器阵列

MyArrayOfMachines Server ((2..3)+(5..9))

答案 4 :(得分:0)

你可以传递一个字符串并对其进行评估:

function Test([string]$range) {
  if ($Range -match '^\d+\.\.\d+$') {
    $RangeArray = Invoke-Expression $Range
  } else {
    $RangeArray = 1..5
  }
}

进行了一些最小化验证,以确保用户无法传递任意代码。