Невозможно объединить условия в операторе If в VBScript
Я пытаюсь определить, было ли это между 12:00 и 1:00. Вот мое заявление if:
If InStr(Time,"12") AND InStr(Time,"AM") Then
' Do something
Else
' Do something else
End If
Проблема в том, что это утверждение оценивается как ложное, даже если оба условия выполняются. Я знаю это, потому что я попробовал вложенный, если так
If InStr(Time,"12") Then
If InStr(Time,"AM") Then
' Do something
...
И это работает. Это тоже работает
If InStr(Time,"12")<>0 AND InStr(Time,"AM")<>0 Then
' Do something
...
Но если он работает как вложенный if, почему я не могу проверить оба вложенных условия if в одном операторе if?
Я заменил вызовы функции InStr значениями, которые они возвращают
If 1 AND 10 Then
' Do something
Else
' Do something else
End If
И произошло то же самое: оператор if был оценен как ложный, и вместо него были выполнены команды "Сделать что-то еще". Но когда я вложил второе условие в качестве другого оператора if внутри первого оператора if, были выполнены команды "Сделать что-то".
Почему это так и есть ли способ сделать это без <>0 и без вложенности?
4 ответа
Проблема, которую вы заметили, вызвана тем, что VBScript использует одни и те же операторы для логических и битовых операций, в зависимости от типа данных операндов. InStr
Функция возвращает числовое значение, если одна из строк неNull
Таким образом, операция становится побитовым сравнением, а не логическим сравнением, как указал JosefZ. Поведение документировано:
And
Оператор также выполняет побитовое сравнение идентично расположенных бит в двух числовых выражениях и устанавливает соответствующий бит вresult
[...]
Демонстрация:
>>> WScript.Echo "" & (True And True) Правда >>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b00000 >>> WScript.Echo "" & (6 И 2) '0b0110 && 0b0010 ⇒ 0b00102
Чтобы обеспечить логическое сравнение, вам нужно использовать InStr(...) > 0
или же CBool(InStr(...))
(оба из которых приводят к логическому результату), а не просто InStr(...)
(который приводит к числовому результату).
If Time() >= TimeValue("12:00:00") AND Time() <= TimeValue("23:59:59") then
'Do Something
ElseIf Time() >= TimeValue("00:00:00") AND Time() <= TimeValue("01:00:00") then
'Do the same
Else
'Do something different
End If
Это должно работать:)
Когда вы используете Time()
функция и если результат так 10:12:12 AM
в этом случае Instr
приведет к Ture
так как Instr
по умолчанию используется vbbinarycompare
ищу любого 12
в двоичном формате в 10:12:12 AM
и есть сек и мин 12, поэтому он вернет истину. просто попробуйте это:
myHour=replace(Time,Right(Time,9),"") 'get only the hour from time
myAMPM=replace(Time,Time,Right(Time,2)) 'get only AM or PM from time
If InStr(1,myHour,12,1) > 0 AND InStr(1,myAMPM,"AM",1) > 0 Then
wscript.echo "True"
Else
wscript.echo "False"
End If
Дата и время хранятся в виде количества дней, где полночь равна 0,0, а 1 час - 1/24:
If Time <= 1/24 Then ' or If Time <= #1am# Then