Powershell - Массив Диапазон от ввода пользователя - PullRequest
2 голосов
/ 29 сентября 2011

Какой самый простой способ получить пользовательский ввод для диапазона массива.

Например:

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 ]

4 голосов
/ 29 сентября 2011

Разве это не работает?Если я не понял ваш вопрос ...

function test($range){

$range

}

test -range (1..5)
2 голосов
/ 30 сентября 2011

Вы также можете принять диапазон в виде строки и проанализировать его самостоятельно:

   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).Это означает, что вы не можете строго ввести параметр.

1 голос
/ 29 сентября 2011

Сделайте два параметра:

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

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

test 1 5

Если они вводят начало и конец диапазона, вы можете использовать его для динамического создания в функции.

EDIT :

Чтобы получить диапазон из строки, попробуйте:

function test{
    param ($Range)

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

test 1..5
0 голосов
/ 20 апреля 2012

Вы можете просто передать строку и оценить ее:

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

Для проверки того, что пользователь не может передать произвольный код, выполняется некоторая минимальная проверка.

0 голосов
/ 30 сентября 2011

Я согласен с @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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...