【问题标题】:Cannot Combine Conditions Normally in If Statement in VBScriptVBScript的if语句中不能正常组合条件
【发布时间】:2018-09-13 16:20:47
【问题描述】:

我正在尝试确定它是否在凌晨 12 点到凌晨 1 点之间。这是我的 if 语句:

If InStr(Time,"12") AND InStr(Time,"AM") Then 
    ' Do something
Else
    ' Do something else
End If

问题是这个语句的计算结果为假,即使两个条件都为真。我知道这一点是因为我尝试过这样的嵌套 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 且没有嵌套的情况下做到这一点?

【问题讨论】:

  • If x AND y 中的AND 运算符对两个数值表达式中位置相同的位进行位比较。应用 If x * y 而不是 false 的值等于 0,反之亦然。
  • 谢谢,这很奇怪,但我想这是有道理的。如果您将此作为答案,我会将其标记为答案
  • Instr 不返回 TrueFalse。它返回搜索字符串第一次出现的位置,如果未找到,则返回 0。也许这让你感到困惑?
  • 对,这就是我的意思,Instr 不返回布尔值,它返回一个整数。
  • 问题在于 VBScript 对布尔 位操作使用相同的运算符,具体取决于操作数的数据类型。行为是documented。要强制进行布尔比较,您需要使用 InStr(...) &gt; 0CBool(InStr(...))(两者都计算为布尔结果)而不是仅使用 InStr(...)(计算结果为数字结果)。

标签: if-statement vbscript multiple-conditions


【解决方案1】:
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

这应该工作:)

【讨论】:

  • 第一个条件是什么,OP 要求在 12 AM 和 1 AM 之间而不是 12 PM 和 11:59:59 PM?
  • 如果不是因为两件事,我会将其标记为答案:1)虽然这会起作用,但这是一种更复杂的方法。我宁愿使用 InStr(Time,"12") 0 AND InStr(Time,"AM") 而不是那样。你已经把 5 行变成了 7 行; 2) 正如 Lankymart 所指出的,提供给 TimeValue() 函数的参数不正确。不过,我非常感谢您的意见
  • @Lankymart 加上 ElseIf 条件,它是在凌晨 12 点和凌晨 1 点之间。这也是为什么您需要两个条件的原因,我们正在寻找两个不同日期的时间。
【解决方案2】:

您观察到的问题是由于 VBScript 对布尔运算和位运算使用相同的运算符,具体取决于操作数的数据类型。 InStr 函数返回一个数值,除非其中一个字符串是 Null,因此该操作变为按位比较而不是布尔比较,正如 JosefZ 指出的那样。行为是documented

And 运算符还对两个数值表达式中位置相同的位进行按位比较,并设置 result 中的相应位 [...]

演示:

>>> WScript.Echo "" & (True And True) 真的 >>> WScript.Echo "" & (6 And 1) '0b0110 && 0b0001 ⇒ 0b0000 0 >>> WScript.Echo "" & (6 And 2) '0b0110 && 0b0010 ⇒ 0b0010 2

要强制进行布尔比较,您需要使用 InStr(...) &gt; 0CBool(InStr(...))(两者都计算为布尔结果)而不是仅使用 InStr(...)(计算结果为数字结果)。

【讨论】:

  • 仅供参考,我在这两种情况下都使用了 CBool​​(InStr(...)) 并且效果很好。这是建议的最简单的方法,也是最能保留 If 语句含义的方法。谢谢!
  • 我很欣赏 VBScript 处理这些操作的方式的解释。我刚刚在处理实际问题的方式中发现了致命缺陷:在上午的任何时候,当小时、分钟或秒等于 12,而不仅仅是小时,这种情况都会测试为真。相反,我使用If Hour(Time) = 0 Then
【解决方案3】:

日期和时间存储为number of days,其中午夜是 0.0,凌晨 1 点是 1/24:

If Time <= 1/24 Then       ' or If Time <= #1am# Then

【讨论】:

    【解决方案4】:

    当您使用Time() 函数时,如果以这种方式Instr 将产生Ture,因为Instr 默认使用vbbinarycompare 寻找任何12in 二进制格式@ 987654328@ 并且有 sec 和 min 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
    

    【讨论】:

    • VBscript 和 vb.net 有同样的问题,您必须为它们提供一切准备工作,但此时会发生错误发生在进程内部的进程中
    猜你喜欢
    • 2011-03-14
    • 2017-11-25
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多