单行与多行:设置变量后的结果不同,并且仅当从命令传递参数时

单行与多行:设置变量后的结果不同,并且仅当从命令传递参数时

为什么除了 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"

相关内容