我对VB脚本有一个非常基本的疑问:
Msgbox "This is myName" ' This works fine
Msgbox "This is "myName"" ' This gives an error
Msgbox "This is ""myName""" 'This works fine
我的问题是如果我需要保存(在变量中)或用双引号显示字符串,为什么我需要为单词或短语使用两次双引号。使用常见的双引号是否意味着我要显示整个内容或可以将其保存为变量中的字符串?
我对VB脚本有一个非常基本的疑问:
Msgbox "This is myName" ' This works fine
Msgbox "This is "myName"" ' This gives an error
Msgbox "This is ""myName""" 'This works fine
我的问题是如果我需要保存(在变量中)或用双引号显示字符串,为什么我需要为单词或短语使用两次双引号。使用常见的双引号是否意味着我要显示整个内容或可以将其保存为变量中的字符串?
在 VBScript 中,字符串文字用双引号 ( "
) 括起来。这是您的第一个示例显示的内容:
Msgbox "This is myName" ' This works fine
但是,如果您想在字符串文字中包含一个双引号字符,就会遇到问题,因为 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
每种语言都有自己的转义字符。偶然与否,在 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
必须对字符串文字进行分隔以将字符串中的内容与外部分开。VBScript 中的字符串定界符是 "(双引号)。其他语言也使用 ",有些语言使用 '(单引号)作为替代或语义稍有不同的定界符。
要在字符串文字中包含分隔符,必须对其进行转义(标记为不表示字符串的“结束”或“开始”。字符串文字中“的转义标记是”。给出“” - 在 VBscript 中。其他语言使用\"
转义双引号。
所以
Msgbox "This is ""myName""" 'This works fine
x = "This is ""myName"""
如果您要显示(或存储)什么,则 VBScript 是正确的This is "myName"
。
VBScript 中的双引号包含一个字符串。如果在字符串中插入单个双引号,它会过早终止字符串,其余部分会导致错误。因此,您必须在字符串中转义双引号,这可以通过将它们加倍来完成。这就是为什么您的第 3 个命令有效而您的第 2个命令无效的原因。