批处理“if”语句不起作用

时间:2018-03-05 19:29:14

标签: batch-file variables if-statement

我的“if”语句似乎有问题。目前在“开始”暂停后,文件刚刚关闭,没有其他任何事情发生。机会是,我不知道我在做什么。

@echo off

set startnum=0
goto start

:start
pause
set startnum="!startnum!"+1
if "%startnum%"="%0%" goto fail
if "%startnum%"="%1%" goto success
goto start

:success
cls
echo It worked!
echo "%startnum%"
pause.
exit

:fail
cls
echo Failure
pause.
exit

2 个答案:

答案 0 :(得分:1)

第一个问题:

set startnum="!startnum!"+1

显然,您希望将1添加到startnum

您的set命令会将startnum设置为"!startnum!"+1。从字面上看。要执行算术运算,您需要set /a

set /A startnum="!startnum!"+1

嗯,这不起作用,因为"!startnum!不是数字。如果您事先调用delayedexpansion,则startnum的值将替换为!startnum!,而set /A startnum="0"+1会产生更多,但仍然没有多大意义。{/ p>

set /A startnum=startnum+1

startnum添加1 - 请参阅文档提示中的set /?

set /A startnum+=1

还会为startnum添加1。

下一个问题。

if "%startnum%"="%0%" goto fail

好吧,你似乎找到了lss和所有帮派。问题是简单的比较运算符是==,而不是=

if "%startnum%"=="%0%" goto fail

现在 - 那会怎么做?它将 thecontentsofstartnum thecontentsof0 。由于引用了这些参数的两个,批处理将执行字符串比较。通过字符串比较, 123 89 ,因为 1小于{{1 }}

但是 - 你正在尝试等价比较(8,因为可以使用运算符而不是equ)所以前面的点只是AAMOI。

难度为==您可能认为尝试提取变量%0%的值,但实际上它将0替换为%0参数的值batchfile,这是批处理文件名本身,所以你得到 batchfilename %” - 可能不是你真正想要的。

0th

是实施该测试的方法。

答案 1 :(得分:0)

第一个 IF 语句由cmd.exe预处理

if ""!startnum!"+1"="test.bat" goto fail

这是完全无效的 IF 条件。

由于cmd.exe

"="test.bat""输出语法错误消息并退出批处理文件处理。这可以通过debugging the batch file看到。

解决方案是使用

的正确语法
  • 为环境变量
  • 分配值
  • 算术表达式,
  • 最后但并非最不重要的是 IF 条件本身。

修复了批处理文件代码:

@echo off

set "startnum=0"
goto Begin

:Begin
set /A startnum+=1
if "%startnum%" == "0" goto Fail
if "%startnum%" == "1" goto Success
goto Begin

:Success
cls
echo It worked!
echo "%startnum%"
pause
exit /B

:Fail
cls
echo Failure
pause
exit /B

在此处删除 IF 条件下的所有双引号是安全的。

还有一个提示:请勿使用 START 等命令的名称作为标签。它可以工作,但是如果要在批处理文件中添加命令 START 并搜索命令或标签,就应该避免这种情况。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /? ...解释了如何引用批处理文件参数。
  • cls /?
  • echo /?
  • exit /?
  • goto /?
  • if /?
  • pause /?
  • set /?

进一步阅读以下问题的答案: