【问题标题】:About using Double quotes in Vbscript关于在 Vbscript 中使用双引号
【发布时间】:2013-03-24 03:07:43
【问题描述】:

我对vb脚本有一个非常基本的疑问:

Msgbox "This is myName" ' This works fine

Msgbox "This is "myName""  ' This gives an error

Msgbox "This is ""myName"""   'This works fine

我的问题是如果我需要保存(在变量中)或显示带有双引号的字符串,为什么我需要对单词或短语使用双引号两次。使用常见的双引号是否意味着我要显示整个内容或可以将其保存为变量中的字符串?

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    在 VBScript 中,字符串文字用双引号 (") 括起来。这是您的第一个示例显示的内容:

    Msgbox "This is myName" ' This works fine
    

    然而,如果你想在你的字符串文字中包含一个双引号字符inside,你就会遇到问题,因为 VBScript 会将它找到的第二个双引号字符解释为表示字符串文字的结尾。这是您的第二个示例显示的内容:

    Msgbox "This is "myName""  ' This gives an error
                           ^   ' because it prematurely terminates the string here
                               ' and doesn't know what to do with the trailing "
    

    幸运的是,有一个逃生舱口。它涉及用另一个字符转义双引号字符,表明 VBScript 应将其作为文字双引号字符处理,而不是神奇的“字符串结尾文字”字符。 VBScript 使用的转义字符恰好是双引号字符。这是您的第二个示例显示的内容:

    Msgbox "This is ""myName"""   'This works fine
    
    • 字符串以单双引号开始,表示字符串文字的开始。
    • 然后你想嵌入一个双引号字符,所以你使用其中的两个。这是转义开始的地方:您转义双引号字符与另一个双引号字符。
    • 然后你再做一次逃避的事情。
    • 最后,用另一个双引号字符终止整个字符串文字。

    其他语言通常使用反斜杠 (\) 作为转义字符。这可能会让事情更容易看到。假设 VBScript 使用反斜杠作为转义字符而不是双引号,您的代码将如下所示:

    Msgbox "This is \"myName\""   ' doesn't work in VBScript; example only
    

    如果这种语法让您感到困扰,您可以为双引号声明一个常量并每次都使用它:

    Const Quote = """"
    
    ' ... later in the code ...
    
    Msgbox "This is " & Quote & "myName" & Quote
    

    【讨论】:

      【解决方案2】:

      每种语言都有自己的escape character。偶然与否,在 VB/VBS 中它是双引号。而且无论是否偶然,我们只能在文字字符串中嵌入双引号。例如,我们不能嵌入其他特殊字符作为 Tab。

      但是,使用 VB/VBS 转义字符简化了我们的编码。

      str = """D:\path\to\xyz.exe"" ""arg 1"" ""arg 2"""
      WScript.Echo str  ' "D:\path\to\xyz.exe" "arg 1" "arg 2"
      
      str = Chr(34) & "D:\path\to\xyz.exe" & Chr(34) & " " _
          & Chr(34) & "arg 1" & Chr(34) & " " & Chr(34) & "arg 2" & Chr(34)
      WScript.Echo str  ' "D:\path\to\xyz.exe" "arg 1" "arg 2"
      
      str = Join(Array("", "D:\path\to\xyz.exe", " ", "arg 1", " ", "arg 2", ""), Chr(34))
      WScript.Echo str  ' "D:\path\to\xyz.exe" "arg 1" "arg 2"
      

      但我个人更喜欢使用Replace,因为它使我的代码更具可读性。

      str = Replace("'D:\path\to\xyz.exe' 'arg 1' 'arg 2'", Chr(39), Chr(34))
      WScript.Echo str  ' "D:\path\to\xyz.exe" "arg 1" "arg 2"
      

      您可以使用Replace(如果方便的话)和其他特殊字符。

      str = Replace(Replace("A|B|C!1|2|3", "!", vbNewLine), "|", vbTab)
      WScript.Echo str
      'A  B   C
      '1  2   3
      

      【讨论】:

      • 除了命令行,vbs 转义字符在 vbs 命令行上不起作用,"1 ""2 3"" 4" 只是连接成1 2 3 4。这会阻止引号字符嵌套。例如,对于可执行文件,这不是问题。
      【解决方案3】:

      必须对字符串文字进行分隔,以将字符串中的内容与外部分开。 VBScript 中的字符串定界符是 "(双引号)。其他语言也使用 ",有些使用 '(单引号)作为替代或语义稍有不同的定界符。

      要在字符串文字中包含分隔符,必须对其进行转义(标记为不表示字符串的“结束”或“开始”。字符串文字中“的转义标记是”。在VBscript中给出“”-。 其他语言使用\" 转义双引号。

      所以

      Msgbox "This is ""myName"""   'This works fine
      x = "This is ""myName"""
      

      如果您要显示(或存储)This is "myName" 的内容,则 VBScript 是正确的。

      【讨论】:

        【解决方案4】:

        VBScript 中的双引号包含一个字符串。如果在字符串中插入单个双引号,它会过早终止字符串,其余部分会导致错误。因此,您必须在字符串中转义双引号,这可以通过将它们加倍来完成。这就是为什么您的 3rd 命令有效而您的 2nd 无效的原因。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-22
          • 2014-09-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-28
          • 1970-01-01
          相关资源
          最近更新 更多