Невозможно объединить условия в операторе If в VBScript - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь определить, было ли это между 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 ]

0 голосов
/ 17 сентября 2018

Когда вы используете функцию Time() и, если результат такой, 10:12:12 AM таким образом, Instr приведет к Ture, поскольку Instr по умолчанию использует vbbinarycompare, ища любой 12 в двоичном формате в 10:12:12 AM и есть секунд и минут 12, поэтому он вернет True.просто попробуйте это:

  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 голосов
/ 14 сентября 2018

Проблема, которую вы заметили, вызвана тем, что VBScript использует одни и те же операторы для логических и битовых операций, в зависимости от типа данных операндов. Функция InStr возвращает числовое значение, если только одна из строк не является Null, поэтому операция становится побитовым сравнением, а не логическим сравнением, как указывало JosefZ . Поведение задокументировано :

Оператор And также выполняет побитовое сравнение идентично расположенных бит в двух числовых выражениях и устанавливает соответствующий бит в result [...]

Демонстрация:

>>> <b>WScript.Echo "" & (True And True)</b>
True
>>> <b>WScript.Echo "" & (6 And 1)</b>   <i>'0b0110 && 0b0001 &rArr; 0b0000</i>
0
>>> <b>WScript.Echo "" & (6 And 2)</b>   <i>'0b0110 && 0b0010 &rArr; 0b0010</i>
2

Чтобы обеспечить логическое сравнение, вам нужно использовать InStr(...) > 0 или CBool(InStr(...)) (оба из которых оценивают как логический результат) вместо просто InStr(...) (который оценивает как числовой результат).

0 голосов
/ 14 сентября 2018

Дата и время сохраняются как количество дней , где полночь - 0,0, а 1 час - 1/24:

If Time <= 1/24 Then       ' or If Time <= #1am# Then
0 голосов
/ 14 сентября 2018
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

Это должно работать:)

...