批处理脚本如果字符串上的命令

批处理脚本如果字符串上的命令

我的批处理脚本的以下命令行有什么问题?

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" (

相关内容