使用set / a

时间:2017-07-11 22:23:05

标签: batch-file

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

以下是我的代码片段:

@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

每次我启动此代码时,都会遇到'Missing operator'。                                    '缺少运营商。'                                    “ECHO已关闭。”                                    '按任意键继续......'

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

1 个答案:

答案 0 :(得分:0)

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

: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等可执行文件,其中包含完整路径和文件扩展名,以使批处理文件独立于环境变量 PATH PATHEXT

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

上的答案

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

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

@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的目录或文件。如果要排除文件名并检查目录是否存在,请在目录路径上附加反斜杠。如果要检查当前目录中是否存在目录,请删除路径开头的反斜杠。

: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,与检查是否存在的上述批次代码进行比较当前驱动器的 root 目录中的文件或目录SystemLiME以及目录pkgs中的文件或目录SystemLiME

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

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