Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批次;如果;声明不起作用_Batch File_Variables_If Statement - Fatal编程技术网

Batch file 批次;如果;声明不起作用

Batch file 批次;如果;声明不起作用,batch-file,variables,if-statement,Batch File,Variables,If Statement,我似乎对我的“如果”陈述有问题。当前,在“开始”中暂停后,文件将关闭,其他情况不会发生。很可能,我不知道自己在做什么 @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

我似乎对我的“如果”陈述有问题。当前,在“开始”中暂停后,文件将关闭,其他情况不会发生。很可能,我不知道自己在做什么

@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

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

if ""!startnum!"+1"="test.bat" goto fail
这是一种完全无效的IF条件

cmd.exe
由于
“=”test.bat”“
而输出语法错误消息,并退出批处理文件处理。这一点可以从下面的例子中看出

解决方案是使用正确的语法

  • 为环境变量赋值
  • 一个算术表达式
  • 最后但并非最不重要的是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并搜索命令或标签时,应该避免使用它

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • 呼叫/?
    。。。说明如何引用批处理文件参数
  • cls/?
  • echo/?
  • 退出/?
  • goto/?
  • 如果/?
  • 暂停/?
  • 设置/?
进一步阅读以下问题的答案:

    • 第一个问题:

      set startnum="!startnum!"+1
      
      显然,您希望将
      1
      添加到
      startnum

      您的
      set
      命令将
      startnum
      设置为
      “!startnum!”+1
      。字面上要执行算术,您需要
      设置/a

      set /A startnum="!startnum!"+1
      
      好吧,这不起作用,因为
      “!startnum!
      不是数字。如果您事先调用了
      delayedexpansion
      ,那么
      startnum
      的值将被
      !startnum!
      替换,从而产生
      set/A startnum=“0”+1
      ,这会更有效,但仍然没有多大意义

      set /A startnum=startnum+1
      
      将1添加到
      startnum
      -请参见提示文档中的
      set/?

      set /A startnum+=1
      
      也会将1添加到
      startnum

      下一个问题

      if "%startnum%"="%0%" goto fail
      
      好吧,您似乎已经找到了
      lss
      和所有这些组合。问题是简单的比较运算符是
      =
      ,而不是
      =

      if "%startnum%"=="%0%" goto fail
      
      现在-这将做什么?它将比较“StartNum的内容”和“0的内容”。由于引用了这两个参数,batch将执行字符串比较。通过字符串比较,123小于89,因为
      1
      小于
      8

      但是-您正在尝试进行等价比较(
      eq
      ,因为可以使用运算符而不是
      =
      ),因此前面的一点就是AAMOI

      困难在于
      %0%
      ,您可能认为它试图提取变量
      0
      的值,但实际上它将
      %0
      替换为批处理文件的
      0th
      参数的值,而批处理文件本身就是批处理文件名,因此您得到的是“batchfilename%”,这可能不是您真正想要的

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

      是实现该测试的方法。

      您认为
      %0%
      %1%
      是什么?哎呀,它们是该代码行中的变量。即使我修复了它,它仍然不起作用。谢谢。经过更多的搜索和思考,我实际上最终让它完全独立工作,但这是一个很好的答案。