批处理命令脚本,前导零的无效数字?

时间:2013-02-07 11:20:16

标签: batch-file batch-processing

我正在尝试生成一个脚本,通过批量使用循环在多个视频卡输入上运行ffmpeg。到目前为止,我有:

除了尝试这样做之外,它的效果很好:

set /a cam=%%cc="08"时的

c="09"。我明白了:

  

号码无效。数字常量是十进制(17),   十六进制(0x11)或八进制(021)。

是什么给出的?这是代码:

@echo off
setlocal enabledelayedexpansion

for %%c in (01 02 03 04 05 06 07 08 09 10 11) do (
  set /a cam=%%c
  if !cam! leq 8 (
    echo foobar_sd%%c
  ) else (
    echo barfoo_hd%%c
  )
  pause
)

2 个答案:

答案 0 :(得分:2)

带前导零的数字被解释为八进制(如0x表示十六进制),因此08和09是错误的八进制值。

答案 1 :(得分:2)

parkydr提供了正确的诊断,说明了为什么会出现错误 - 前缀为0的数字被解释为八进制。

有一个简单的解决方案 - 将右侧更改为08并在比较的两侧添加非数字字符以强制进行字符串比较而不是数字比较。这些值正确地排序为字符串,因为它们填充为零,所有字符串都具有相同的长度。我喜欢使用引号,但几乎任何角色都会这样做。

if "!cam!" leq "08" ...

修改

上述解决方案并未直接解决SET /A %%c 0809/A失败的问题。我的解决方案假设已删除cam选项。

if "%%c" leq "08" ... 变量可以完全取消:

08

更好的是,不需要额外的非数字字符,因为IF将if %%c leq 08 ... 视为无效的八进制表示法,默认为字符串比较。

{{1}}

有关详细信息,请参阅Rules for how CMD.EXE parses numbers。有一节专门讨论IF声明。