Решение проблемы
Read-Host выводит строку по умолчанию, вы должны преобразовать ее в int, чтобы сравнение было корректным. Вот как в дальнейшем можно подойти к отладке своего кода (разбить логику на мелкие кусочки):
PS /> $quantity = Read-Host -Prompt "Enter Goal Quantity (1-15)"
Enter Goal Quantity (1-15): 2
PS /> $quantity -match '^\d+$' # => True
PS /> $quantity -gt 0 # => True
PS /> $quantity -le 15 # => False
PS /> ([int] $quantity) -le 15 # => True
В этом случае вы можете использовать -asоператор типа for safe type conversion of the string to int:
$quantity = (Read-Host -Prompt "Enter Goal Quantity (1-15)") -as [int]
Как указывает mklement0 в своем полезном отзыве, того, что я предложил выше, недостаточно для преодоления определенных входных данных, например, для '0xA' -as [int]прохождения проверки.
To overcome this, and without overcomplicating the answer, it would be best if we validate the input with regex up front and then type convert to int, as mklement0 also propose in his helpful comment.
# get input
$quantity = Read-Host -Prompt "Enter Goal Quantity (1-15)"
# if regex validation passes
if($quantity -match '^\d+$') {
# convert here
$quantity = [int] $quantity
В качестве альтернативы вы можете изменить порядок сравнения и позволить PowerShell выполнить преобразование типов на основе LHS операции (это кратко объясняется в разделе Операторы равенства ).
Вот пример, чтобы проверить, что это значит:
[string[]] (-20..20) | ForEach-Object {
[pscustomobject]@{
'Value' = $_
'LHS as int' = 0 -lt $_ -and 15 -ge $_
'LHS as string' = $_ -gt 0 -and $_ -le 15
}
}
Комментариев нет:
Отправить комментарий