Невозможно объединить условия в операторе 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
Другие вопросы по тегам