VBscript的一部分我在HTA内部写作要求用户在文本框中键入一个名称,该文本框将生成一个具有该名称的文件夹。我正在构建对脚本的检查,以确保不使用任何非法字符或名称。在我遇到困难的地方是试图确保如果用户输入COM1或LPT1,他们将被告知他们尝试使用的名称不允许而不是出现脚本错误。问题是如果没有为每种可能的方式编写一个If语句,我无法弄清楚如何做到这一点,COM1到COM9和LPT1到LPT9中的字母可以安排在不同的情况下(例如com1,Com1,cOm1等)。 )。下面的代码片段显示了我的意思。
sFldrName = BasicTextbox.Value
sFldrBadMsg = "You've chosen an illegal folder name."
If sFldrname = "COM1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "COM2" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "COM3" Then
Msgbox sFldrBadMsg
在上面的例子中,用户输入文本框的任何内容都被分配到" sFldrname"。然后脚本检查字符串是否已分配" sFldrname"是COM1或COM2或COM3。问题是我只能在指定的确切情况下检查这些字符串。如果用户输入COM1,他们将收到我的警告信息。但是,如果他们输入com1(全部小写)或CoM1(混合大小写),他们将收到脚本错误,因为无论如何它仍然是非法名称。为了用我上面使用的方法解释这个问题,我必须做这样的事情:
sFldrName = BasicTextbox.Value
sFldrBadMsg = "You've chosen an illegal folder name."
If sFldrname = "COM1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "Com1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "COm1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "cOm1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "coM1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "cOM1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "CoM1" Then
Msgbox sFldrBadMsg
ElseIf sFldrname = "com1" Then
Msgbox sFldrBadMsg
我必须通过COM9和LPT1到LPT9为COM2做到这一点。我真的不想这样做。所以,当我检查" sFldrname"的值时看看它是什么字符串,有没有办法忽略该字符串的情况?或者,有没有更好的方法去做我想做的事情?感谢。
答案 0 :(得分:1)
正如其他人已经提到的那样,规范的方法是将要比较的变量的值大写(或小写):
If LCase(sFldrname) = "com1" Then
Msgbox sFldrBadMsg
ElseIf LCase(sFldrname) = "com2" Then
Msgbox sFldrBadMsg
ElseIf LCase(sFldrname) = "com3" Then
Msgbox sFldrBadMsg
End If
使用StrComp
功能将是另一种选择:
If StrComp(sFldrname, "COM1", vbTextCompare) = 0 Then
Msgbox sFldrBadMsg
ElseIf StrComp(sFldrname, "COM2", vbTextCompare) = 0 Then
Msgbox sFldrBadMsg
ElseIf StrComp(sFldrname, "COM3", vbTextCompare) = 0 Then
Msgbox sFldrBadMsg
End If
但是,由于您正在对同一个变量进行n路比较,因此最佳选择可能是与UCase
或LCase
组合的Select
语句:
Select Case UCase(sFldrname)
Case "COM1", "COM2", "COM3" : MsgBox sFldrBadMsg
Case Else : MsgBox "OK"
End Select
答案 1 :(得分:0)
将输入转换为大写,然后与大写的禁用字符串进行比较:
If uCase(sFldrname) = "COM1" Then
...
为了避免使用禁用字符串的错误,也将它们大写:
If uCase(sFldrname) = uCase("COM1") Then
...
答案 2 :(得分:0)
嗯,你可以这样做:
If UCase(sFldrname) = "COM1" Then
Msgbox sFldrBadMsg
end if
这将使您的字符串大写,然后您可以将结果与全部大写进行比较。你最好可能只是寻找COM和冒号。现在,为了最好的安全,。并且确保路径是正确的,你想要看一些更严肃的东西,比如正则表达式。正则表达式可以将用户输入并测试它以获得有效的"路径,如"字符串。
类似的东西:
Dim RegEx, bFound
Set RegEx = New RegExp
RegEx.IgnoreCase = True
RegEx.Pattern = "^(?:\b((?#drive)[a-z]):\\((?#folder)[^/:*?""<>|\r\n]*\\)?((?#file)[^\\/:*?""<>|\r\n]*))$"
bFound = RegEx.Test(Data)
当用户输入VALID驱动器,文件夹和文件名时将匹配。或者,您使用RegEx的其他迭代来测试匹配。请记住,您不必检查&#34; COM1:&#34;,&#34; LPT1:&#34;等,因为RegEx不会允许冒号在路径中,除非在开始写驱动器信...
Dim RegEx
Set RegEx = New RegExp
RegEx.IgnoreCase = True
RegEx.Pattern = "\b((?#drive)[a-z]):\\((?#folder)[^/:*?""<>|\r\n]*\\)?((?#file)[^\\/:*?""<>|\r\n]*)"
If RegEx.Test(sFldrname ) Then
' Successful match
Else
' Match attempt failed
End If
现在,我们只想说您要测试用户输入中的DOS设备名称。您可以使用如下所示的RegEx来测试COMn:,LPTn:,CON:和NIL:的所有组合。当然,这个RegEx要求输入START与COM,LPT,CON等,如果字符串不以它开头,例如,让他们输入目录名称Wel com 强> e,或者,当Wel COM3:时,RegEx不匹配,表示路径干净。如果您希望它能够在ENTIRE输入字符串中搜索COM {n}:的外观,则删除模式中的\ b ...
Dim RegEx
Set RegEx = New RegExp
RegEx.IgnoreCase = True
RegEx.Pattern = "\b(COM[0-9]+|LPT[0-9]+|CON|NIL)\:"
If RegEx.Test(sFldrname ) Then
' We discovered a DOS Device name as a PATH, and it is therefore invalid.
End If
现在,为了解决您的实际问题,您需要注意RegEx.IGNORECASE = true
。那是你洞里的王牌......
在我的第一个例子中,我只向您展示了如何进行不区分大小写的字符串比较的教训,您将使用OFTEN编写任何语言的任何代码。我告诉你其他的例子更多的是&#34;适当的&#34;方式,或者更容易&#34;方式,或更多&#34;放心&#34;在路径中搜索坏事的方法。我认为,对于更加稳定的代码库,您需要研究更稳定,更少代码的内容,这一点非常重要。因为你正在处理PATHS,正如你所知道的那样,某人输入可以将它们放在错误文件夹中的路径名是一种严肃的能力(例如,现在输入文件夹名称如..\..\..\..\..\..\Windows\System32\
,它们就结束了使用在Windows System32中创建的文件夹,根据您的应用程序的作用,这可能是一个严重的安全风险。所以,不要只使用我演示的正则表达式。您采用的策略如FORCING起始目录到是您的程序主目录,并吃任何句号,反斜杠和任何其他&#34;路径&#34;字符,并强制在您的家庭目录下创建目录。希望这有帮助,抱歉大量的数据,但我们一直都在你身边!