【问题标题】:Missing Operator when using set /a使用 set /a 时缺少运算符
【发布时间】:2017-07-11 22:23:05
【问题描述】:

所以我正在创建一个批处理操作系统,但问题是......它一直说缺少操作员!!

这是我的代码的 sn-p:

@echo off

 title LiME - Version 1.0 
 mode con: cols=86 lines=21

 if exist "\SystemLiME" goto startup.jsc

   ) else (

 if not exist "\SystemLiME" goto boot.jfk


 :boot.jfk

cls

echo                                         MAINBOOTCONFIG                                        

echo.

echo CHECKING FOR VOLUMES TO CREATE..

ping localhost -n 5 >nul

 if exist "\SystemLiME" set create-vol1=0

  ) else (

 if not exist "\SystemLiME" set create-vol1=1

 if exist "\SystemLiME\pkgs" set create-vol2=0

  ) else (

 if not exist "SystemLiME\pkgs" set create-vol2=1

 if %create-vol1% == 0 set /a count-vol-create=0
 if not %create-vol1% == 0 set /a count-vol-create=%count-vol-create%+=1

 if %create-vol2% == 0 set /a count-vol-create=%count-vol-create%+=0
 if not %create-vol2% == 0 set /a count-vol-create=%count-vol-create%+=1

 echo %count-vol-create%
 pause

但我关注的是这个:

:boot.jfk

 cls

 echo                                         MAINBOOTCONFIG                                        

 echo.

 echo CHECKING FOR VOLUMES TO CREATE..
 ping localhost -n 5 >nul

 if exist "\SystemLiME" set create-vol1=0

  ) else (

 if not exist "\SystemLiME" set create-vol1=1

 if exist "\SystemLiME\pkgs" set create-vol2=0

  ) else (

 if not exist "SystemLiME\pkgs" set create-vol2=1

 if %create-vol1% == 0 set /a count-vol-create=0
 if not %create-vol1% == 0 set /a count-vol-create=%count-vol-create%+=1

 if %create-vol2% == 0 set /a count-vol-create=%count-vol-create%+=0
 if not %create-vol2% == 0 set /a count-vol-create=%count-vol-create%+=1

 echo %count-vol-create%
 pause

每次启动此代码时,我都会收到“缺少运算符”。 “缺少接线员。” “ECHO 已关闭。” '按任意键继续...'

请帮帮我!! :'((顺便说一句,我是stackoverflow的新手:))

【问题讨论】:

  • 在使用 set /a 时不要在变量名中添加破折号。
  • 现在是缺少操作数。

标签: batch-file


【解决方案1】:

使用此批代码替换第二个发布的批代码:

:boot.jfk
cls
echo                                         MAINBOOTCONFIG
echo/
echo CHECKING FOR VOLUMES TO CREATE..
%SystemRoot%\System32\ping.exe localhost -n 5 >nul
if exist "\SystemLiME" ( set "CreateVol1=0" ) else ( set "CreateVol1=1" )
if exist "\SystemLiME\pkgs" ( set "CreateVol2=0" ) else ( set "CreateVol2=1" )
if %CreateVol1% == 0 ( set "CountVolCreate=0" ) else ( set /A "CountVolCreate+=1" )
if not %CreateVol2% == 0 set /A CountVolCreate+=1
echo %CountVolCreate%
pause

关于使用echo/而不是echo.输出空行的原因见DosTips论坛主题
ECHO. FAILS to give text or blank line - Instead use ECHO/

在批处理文件中指定像 ping 这样的带有完整路径和文件扩展名的可执行文件,以使批处理文件独立于环境变量 PATHPATHEXT 的当前值.

IF ELSE syntax error within batch file?batch scripting - if exist ./sdcard/file.any using adb 上查看答案

set /A 之后的字符串被解释为 算术表达式,其中每个空格/运算符分隔的字符串被自动解释为变量名,其当前值应转换为 32 位有符号整数以进行评估的表达。因此,不需要在算术表达式中使用使用%VariableName% 的立即变量扩展或使用!VariableName! 的延迟变量扩展,因为即使在命令块中,只要VariableName 就足够了,除了变量名称包含空格或破折号或其他运算符.

因此,在算术表达式中使用此类变量时,使用包含破折号的变量名是不好的,因为破折号可能被解释为减号运算符。 CamelCase 命名符号的使用通常最适合批处理文件中的变量名。具有 CamelCase 名称的变量可以在批处理文件中轻松读取和搜索/替换,并且肯定不会与 echoremcomment 行中的文本输出混淆,例如在批处理文件中具有以下命令行:

@echo off
rem Assign batch file name to a variable.
set "BatchFileName=%~nx0"
echo Batch file name is: %BatchFileName%
set "BatchFileName="

算术表达式应始终只包含一个等号。像variable=variable+=1 这样的语法绝对是不正确的。右边是variable=variable+1 或更短的variable+=1

阅读Why is no string output with 'echo %var%' after using 'set var = text' on command line? 上的答案,了解为什么建议使用set "variable=value" 来定义(或删除)环境变量。在空格只是分隔符的算术表达式上,通常不需要使用语法set /A "variable=expression",但也有例外,如上面批处理代码第 9 行中的那个。

请注意,if exist "\SystemLiME" 表示当前驱动器的 root 中是否有名称为 SystemLiME 的目录或文件。如果要排除文件名并检查目录是否存在,请在目录路径上附加反斜杠。如果您想检查 current 目录中的目录是否存在,请删除路径开头的反斜杠。

:boot.jfk
cls
echo                                         MAINBOOTCONFIG
echo/
echo CHECKING FOR VOLUMES TO CREATE..
%SystemRoot%\System32\ping.exe localhost -n 5 >nul
if exist "SystemLiME\" ( set "CreateVol1=0" ) else ( set "CreateVol1=1" )
if exist "SystemLiME\pkgs\" ( set "CreateVol2=0" ) else ( set "CreateVol2=1" )
if %CreateVol1% == 0 ( set "CountVolCreate=0" ) else ( set /A "CountVolCreate+=1" )
if not %CreateVol2% == 0 set /A CountVolCreate+=1
echo %CountVolCreate%
pause

与上面检查文件或目录是否存在的批处理代码相比,此批处理代码检查 当前 目录中是否存在 目录 SystemLiMESystemLiME\pkgs SystemLiME 和文件或目录 pkgs 在当前驱动器的 root 目录 SystemLiME 中。

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

  • cls /?
  • echo /?
  • if /?
  • pause /?
  • ping /?
  • set /?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2013-07-07
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多