为什么除了 IF 语句的结构之外,其他一切都相同,但这两组代码块却给出不同的结果?有趣的是,只有当我从命令行传递两个变量的值时,结果才会失败。此时单行命令就会失败。
下面是两个代码块的片段:
我已将其范围缩小到在同一行上设置导致其失败的第二个变量。
失败了:
if "%~1" NEQ "" (set num1=%~1 & set num2=%~2)
虽然这有效:
if "%~1" NEQ "" (set num1=%~1)
set num2=%~2
代码:
必须传递两个数字作为参数才能看到问题
数字对于搜索 10 个字符的字符串的子字符串应该是有效的。
例如 2 和 1、3 和 -1、0 和 5 等等。
如果您不传递数字,而是在批处理中手动设置变量,则两个代码块都可以正常工作。如前所述,问题仅在传递参数时出现,并且仅出现在单行命令中。
@ECHO off & cls
SETLOCAL EnableDelayedExpansion
SET str=ABCDEFGH
::This code works!
echo This will give the correct answer
if "%~1" NEQ "" (
set num1=%~1
set num2=%~2
)
set ans=!str:~%num1%, %num2%!
echo Answer = %ans%
::This code fails!
echo.
echo This will NOT give the correct answer
if "%~1" NEQ "" (set num1=%~1 & set num2=%~2)
set ans=!str:~%num1%, %num2%!
echo Answer = %ans%
答案1
set num1=%~1 & set num2=%~2
根本不等同于单独运行这两个命令,因为有一个尾随空格之后%~1
。这就是为什么人们总是说你应该使用,set "var=value"
即使命令在单独的行上,因为末尾不可见的字符仍会进入变量而用户不会注意到。set "num1=%~1" & set "num2=%~2"
将按预期工作
:: Works
set num1=%~1
set num2=%~2
echo [%num1%], [%num2%]
:: Doesn't work, do you see the difference between this and the above?
set num1=%~1
set num2=%~2
echo [%num1%], [%num2%]
:: Equivalent to the above
set num1=%~1 & set num2=%~2
echo [%num1%], [%num2%]
:: Works
set "num1=%~1"
set "num2=%~2" works even with spaces and random strings after
echo [%num1%], [%num2%]
:: Works
set "num1=%~1" & set "num2=%~2"
echo [%num1%], [%num2%]
答案2
@echo off & setlocal EnableDelayedExpansion
cls & set "str=ABCDEFGH"
:: This code works!
echo;This will give the correct answer
if Not "%~1" == "" set /a "num1=%~1, num2=%~2"
set "ans=!str:~%num1%,%num2%!"
echo;Answer = %ans%
您正在使用数值比较,就像它是字符串比较一样,合并命令/比较:
- 使用
if
(整数)数之间的比较:
if Integer NEQ Integer (command)
if 100001 neq 000001 (pause)
if 000001 neq 100000 (pause)
- 使用
if
字符串之间的比较:
if "string" == "string" (command)
if "case sensitive" == "case sensitive" (pause)
if /i "string" == "STRING" (command)
if /i "case insensitive" == "CASE InSenSiTiVe" (pause)
if Not "case sensitive" == "case sensitive" (pause)
if /i Not "case insensitive" == "CASE InSenSiTiVe" (pause)
- 使用以下命令在同一行定义两个或多个数字变量:
set /a "NameVar=Value, NameVar=Value, NameVar=Value"
set /a "var1=INTEGER, var2=INTEGER, var3=INTEGER"
set /a "var1=100001, var2=200001, var3=100000"