开发者

Powershell - Array Range from user input

What would be the easiest way to get user input for an array range.

For ex开发者_Go百科ample:

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
 }
}

The above function should take the input as the name of the machine and the array range. For now I have the array range hardcoded. When I assign $Range as [Array]$Range in the user prompt, there is a prompt for $Range[0] etc etc. But I would like the user the enter the range.


Doesn't this work? Unless I misunderstood your question...

function test($range){

$range

}

test -range (1..5)


You can also accept the range as a string and parse it yourself:

   function Test
    {
    param($range)

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

The reason for the if / else is for cases where the user passes an actual range, as in manojlds answer, rather than a string to be parsed (like 1..5). This means you can't strongly type the param though.


Make it two parameters:

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

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

test 1 5

If they input the start and end of the range you can use that to create it dynamically in the function.

EDIT:

To get the range from a string, try:

function test{
    param ($Range)

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

test 1..5


I agree with @manojlds, the range should be passed in as an array. Parsing a string limits the possibilities of what a user could enter. By using [int[]] you can force the user to specify an array of integers. This would also allow a user to specify a broken range such as ((2..4)+(6..12)) which is harder to allow for when parsing strings.

In your example I'm not sure where $array is coming from, and you only need one line to return a computed machine name.

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

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

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

You could create a single machine name,

MyArrayOfMachines Laptop 1

a range of machines,

MyArrayOfMachines Workstation (2..10)

or a non-consecutive array of machines

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


You could just pass a string and evaluate it:

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

Some minimal validation is done to ensure that the user cannot pass arbitrary code.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜