基本批量数学转换 - 缺少操作数?

时间:2016-06-22 14:50:42

标签: batch-file math

所以只尝试一个基本的批量数学脚本,但总是告诉我缺少操作数可以有人告诉我为什么以及如何解决它?我在这里寻找类似的问题,并尝试匹配语法,但得到了同样的错误。这是脚本:

@echo OFF
set /p Choice=(a) Amps to Horse Power, (h) Horse Power to Amps:
set /p VOLTAGE=ENTER VOLTAGE:
if %Choice%==a (
  set /p AMPS=ENTER AMPS:
  set /a WATT=%VOLTAGE%*%AMPS%
echo power is:%WATT%
  REM   set /a HP=%WATT% / 746
  REM   echo %HP%
)
if %Choice%==h (
  set /p HP=ENTER HORSEPOWER:
  set /a AMPS=(( %HP% * 746 ) / %VOLTAGE% )
echo %AMPS%
)

1 个答案:

答案 0 :(得分:0)

您的代码中存在以下几个问题:

  • 命令行set /a AMPS=(( %HP% * 746 ) / %VOLTAGE% )中的公式包含括号,它们对命令解释器cmd具有特殊含义:第一个)被视为if %Choice%==h (的右括号命令。要解决此问题,请将整个算术表达式放在引号之间,如set /a "AMPS=(( %HP% * 746 ) / %VOLTAGE% )",或者像set /a AMPS=^(^( %HP% * 746 ^) / %VOLTAGE% ^)这样的插入符转义括号。
  • 当您设置/更改变量并读入相同的带括号的代码块时,您将在执行整个块之前收到存在的值。要解决此问题,您可以使用delayed expansion。但是,在这种特定情况下,当您删除所有set /a命令行中的封闭百分号时,您可以更简单地使用它,例如set /a WATT=VOLTAGE*AMPSset /a命令在没有%%的情况下自行检测变量名称,这具有很大的额外优势,即接收到的值是执行set /a命令时出现的值而不是在代码块开始之前可用的那个。唯一剩下的是echo命令,你不能省略%%标志;但你可以使用像call这样的call echo %%AMPS%% - 技巧,在执行此命令行时强制执行另一个解析阶段,从而导致该时间点可用的变量值(类似于set /a的行为以及延迟扩张。)
  • 如果用户输入任何内容并且只按 ENTER ,则if查询将失败,因此请将两个比较表达式放在引号之间以避免:if /i "%Choice%"=="a";我还要添加开关/i,以使比较不区分大小写。
  • set /p的显示消息应放在引号之间,以避免特殊字符(如())出现问题:set /p Choice="(a) Amps to Horse Power, (h) Horse Power to Amps:"

以下是我可能会使用的代码,转换Amps to Horse Power已完成,并且为分区实现了舍入(到最接近的整数)(因为set /A仅支持带符号的32位整数算术,所以任何潜在的部分部分都被驳回了):

@echo off
set /A "FACTOR=746"
set /A "ROUND=1" & rem set to `1` for rounding and to `0` otherwise;
set /P SEL="(a) Amps to Horse Power, (h) Horse Power to Amps: "
set /P VOLTS="Enter Voltage: "
if /I "%SEL%"=="a" (
    set /P AMPS="ENTER AMPS: "
    set /A "HP=(2*AMPS*VOLTS+ROUND*FACTOR)/(2*FACTOR)"
    call echo Horse Power is: %%HP%%
)
if /I "%SEL%"=="h" (
    set /P HP="Enter Horse Power: "
    set /A "AMPS=(2*HP*FACTOR+ROUND*VOLTS)/(2*VOLTS)"
    call echo Amps is: %%AMPS%%
)