无法在 VBScript 的 If 语句中正常组合条件
Cannot Combine Conditions Normally in If Statement in VBScript
我想确定现在是不是在中午 12 点到凌晨 1 点之间。这是我的 if 语句:
If InStr(Time,"12") AND InStr(Time,"AM") Then
' Do something
Else
' Do something else
End If
问题是即使两个条件都为真,此语句的计算结果为假。我知道这一点是因为我试过嵌套 if like this
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 条件?
我用它们 return
的值替换了 InStr 函数调用
If 1 AND 10 Then
' Do something
Else
' Do something else
End If
同样的事情发生了:if 语句被评估为 false 并且执行了 "Do something else" 命令。但是当我将第二个条件作为另一个 if 语句嵌套在第一个 if 语句中时,执行了 "Do something" 命令。
为什么会这样,有没有办法在没有 <>0 和没有嵌套的情况下做到这一点?
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
这应该有效:)
您观察到的问题是由于 VBScript 根据操作数的数据类型对布尔运算和位运算使用相同的运算符造成的。 function returns a numeric value unless one of the strings is Null
, so the operation becomes a bitwise comparison instead of a boolean comparison, as JosefZ pointed out. The behavior is documented:
The And
operator also performs a bitwise comparison of identically positioned bits in two numeric expressions and sets the corresponding bit in result
[...]
示范:
>>> WScript.Echo "" & (True And True)
True
>>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b0000
0
>>> WScript.Echo "" & (6 And 2) '0b0110 && 0b0010 ⇒ 0b0010
2
要强制执行布尔比较,您需要使用 InStr(...) > 0
或 CBool(InStr(...))
(两者的计算结果都是布尔结果),而不仅仅是 InStr(...)
(其计算结果是数字结果) ).
日期和时间存储为 number of days,其中午夜为 0.0,凌晨 1 点为 1/24:
If Time <= 1/24 Then ' or If Time <= #1am# Then
当您使用 Time()
函数时,如果以这种方式得到 10:12:12 AM
这样的结果 Instr
将得到 Ture
因为 Instr
默认使用 vbbinarycompare
在 10:12:12 AM
中寻找二进制格式的任何 12
并且有 sec 和 min 12 所以它将 Return 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
我想确定现在是不是在中午 12 点到凌晨 1 点之间。这是我的 if 语句:
If InStr(Time,"12") AND InStr(Time,"AM") Then
' Do something
Else
' Do something else
End If
问题是即使两个条件都为真,此语句的计算结果为假。我知道这一点是因为我试过嵌套 if like this
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 条件?
我用它们 return
的值替换了 InStr 函数调用If 1 AND 10 Then
' Do something
Else
' Do something else
End If
同样的事情发生了:if 语句被评估为 false 并且执行了 "Do something else" 命令。但是当我将第二个条件作为另一个 if 语句嵌套在第一个 if 语句中时,执行了 "Do something" 命令。
为什么会这样,有没有办法在没有 <>0 和没有嵌套的情况下做到这一点?
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
这应该有效:)
您观察到的问题是由于 VBScript 根据操作数的数据类型对布尔运算和位运算使用相同的运算符造成的。 Null
, so the operation becomes a bitwise comparison instead of a boolean comparison, as JosefZ pointed out. The behavior is documented:
The
And
operator also performs a bitwise comparison of identically positioned bits in two numeric expressions and sets the corresponding bit inresult
[...]
示范:
>>> WScript.Echo "" & (True And True) True >>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b0000 0 >>> WScript.Echo "" & (6 And 2) '0b0110 && 0b0010 ⇒ 0b0010 2
要强制执行布尔比较,您需要使用 InStr(...) > 0
或 CBool(InStr(...))
(两者的计算结果都是布尔结果),而不仅仅是 InStr(...)
(其计算结果是数字结果) ).
日期和时间存储为 number of days,其中午夜为 0.0,凌晨 1 点为 1/24:
If Time <= 1/24 Then ' or If Time <= #1am# Then
当您使用 Time()
函数时,如果以这种方式得到 10:12:12 AM
这样的结果 Instr
将得到 Ture
因为 Instr
默认使用 vbbinarycompare
在 10:12:12 AM
中寻找二进制格式的任何 12
并且有 sec 和 min 12 所以它将 Return 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