Как сделать переменную диапазоном в PowerShell? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь сделать переменную равной диапазону. Мой скрипт включает в себя пользовательский ввод, и этот ввод должен находиться в определенном диапазоне. Я буду использовать диапазон пару раз в сценарии, поэтому я хочу, чтобы он был переменной. Вот что я попробовал:

    $serverrange = "1..18"

и я попробовал

    $serverrange = 1..18

Я гуглил это, но не могу найти много об этом. Проблема в том, что PowerShell не рассматривает это как диапазон, а видит буквально 1..18. Так что, если я сделаю Write-Output $ serverrange, он отобразится как «1..18». Итак, мой вопрос: как мне сделать так, чтобы он воспринимался как диапазон или как мне изменить скрипт, чтобы включить диапазон? Вот остальная часть сценария:

     #user input for how many servers will be tested
     $numofservers = Read-Host -Prompt "How many servers are being tested?"
     if($numofservers -eq $serverrange) {
     "Proceed"
     } 
     else {
     "Server limit exceeded"
      }

Редактировать: не понимал, что $ serverrange = 1..18 работает.

Ответы [ 3 ]

0 голосов
/ 21 января 2019

Это работает для меня:

> $p = 1..18
> $p
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>

Использование: PS Версия 5.1.14393.1944

0 голосов
/ 22 января 2019

Как вы уже поняли, выражение без кавычек , такое как 1..18, прекрасно работает : оно использует оператор PowerShell оператор диапазона (..) для создания массива смежных целых чисел от 1 до 18; то есть это эквивалент следующего массива литерал :

 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18

В отличие от этого, "1..18" является (расширяемой) строкой , содержимое которой печатается как есть (в данном случае литерал 1..18, поскольку строка не содержит ссылок на переменные). ни подвыражения).

Важно : Хотя технически работает с Invoke-Expression для оценки строки в качестве оператора PowerShell (например, Invoke-Expression "1..18"), этот подход следует избегать : Invoke-Expression является редко подходящим инструментом и представляет угроза безопасности , особенно при несанкционированном вводе пользователем - см. сообщение в блоге команды PowerShell под названием «Вызывание-выражение считается вредным» .

Ваша задача заключается в создании такого диапазона на основе пользовательского ввода , который по умолчанию представляет собой строку , возвращаемую Read-Host.

Оператор диапазона способен динамически преобразовывать любой операнд (конечная точка диапазона) в целое число, и с радостью принимает выражения в качестве конечных точек диапазона

1..(Read-Host 'Enter the upper bound') 

Если вы введете 3 (который, как указано, возвращается как строка ), PowerShell динамически преобразует эту строку в ее целочисленный эквивалент и создает массив 1..3, вывод которого по умолчанию выглядит следующим образом :

1
2
3

Тем не менее, в для того, чтобы (а) предоставить удобный для пользователя запрос о том, что (б) применяет предопределенный диапазон входных данных (чисел), требуется дополнительная работа .

Таким образом:

  • Убедитесь, что вводимые пользователем данные могут быть преобразованы в (a) число , которое (b) попадает в ожидаемый диапазон; если нет, повторите запрос.

  • После получения правильного ввода используйте оператор диапазона PowerShell (..) для построения массива индексов, как вам нужно.

# Define the implied lower bound and the maximum upper bound.
$lowerBound = 1
$maxUpperBound = 18

# Prompt the user for the upper bound of the range, with validation,
# until a valid value is entered.
do {
  $userInput = Read-Host -Prompt "How many servers are being tested?"
  if (
    ($upperBound = $userInput -as [int]) -and 
    ($upperBound -ge $lowerBound -and $upperBound -le $maxUpperBound)
  ) {
    break # valid value entered, exit loop.
  } else {
    # Invalid input: Warn, and prompt again.
    Write-Warning "'$userInput' is either not a number or is outside the expected range of [$lowerBound,$maxUpperBound]."
  }
} while ($true)

# Create the array of indices based on user input.
1..$upperBound
0 голосов
/ 21 января 2019

Если у вас есть строка «1..18», вы можете использовать invoke-expression для ее оценки, например:

PS C:\Users\chris> $s = "1..18"
PS C:\Users\chris> $s
1..18
PS C:\Users\chris> $r = invoke-expression $s
PS C:\Users\chris> $r
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PS C:\Users\chris>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...