我的批处理脚本的以下命令行有什么问题?
set test=BE99012345678901
if %test% == "BE99????????????"(
echo This number begins with BE99
)
Else (
echo This number doesn't begin with BE99
)
pause
答案1
尝试这个:
set test=BE99012345678901
if "%test:~0,4%"=="BE99" (
echo This number begins with BE99
) else (
echo This number doesn't begin with BE99
)
pause
你将得到以下输出:
This number begins with BE99
请注意:
if %test% == "BE99????????????"
将执行以下操作:
"BE99012345678901" == "BE99????????????"
这将显示以下输出:
This number doesn't begin with BE99
答案2
barlop 的回答涵盖了您的大部分问题。还应注意,您需要将ELSE
和 的右括号放在同一行IF
。如下所示:
IF "%var%"=="whatever" (
REM Do stuff
) ELSE (
REM Do other stuff
)
答案3
看起来你不能在 a==b 行中使用问号或任何通配符 == 运算符不将 ? 视为特殊符号,而是将其视为文字。而且它也不会查看文件名。所以,这只能证明它确实将 ? 视为文字。
此外,在 Linux 中,如果您执行 echo ?,shell 会在执行 echo 命令之前对其进行解释,并返回一个长度为一个字符的文件名。在 Windows 中,shell 不会解释 ? 或 *,而是将它们传递给命令。DIR 使用 ? 和 *,将它们视为特殊字符,ECHO 则不会,并且 if == 的相等性测试不会,它只会回显一个问号。我怀疑您在此处所写的内容在 bash 中是否有效。与在 linux 中一样,? 和 * 总是与文件名有关,而您似乎只想进行变量比较。
C:\a>touch BE99 <---- a gnuwin32 touch line to create a file called BE99
C:\a>if BE99==BE9? echo true
C:\a>if "BE99"=="BE9?" echo true
C:\a>
C:\a>dir BE9? /b
BE99
C:\a>
因此,? 适用于 DIR,但不适用于 a==b
但除此之外,如果你执行“4”==4,那么它会显示错误,因为你必须对两个都加上引号,或者都不用。使用引号的原因是,如果你执行 %var%==%var% 并且 %var% 为空,那么你就有语法错误,因为它是通过替换来工作的,替换使得 == 两边都什么都没有,所以只要 if == 就行。所以最好使用引号,而不是不用引号。有些人使用 []。如果 [%var%]==[%var%]
你可以使用这个
C:\a>set test=BE9923432423
C:\a>echo %test:~0,4%
BE99
因此,您可以在代码中执行if "%test:~0,4%"=="BE99" (