GOOGLE ADS

вторник, 26 апреля 2022 г.

PowerShell: странные результаты в простом скрипте [дубликат]

На этот вопрос уже есть ответ здесь:


Решение проблемы

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

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...