【问题标题】:Batch command script, invalid numeric with leading zero?批处理命令脚本,带前导零的无效数字?
【发布时间】:2013-02-07 11:20:16
【问题描述】:

我正在尝试通过批量使用循环来生成一个脚本以在多个视频卡输入上运行 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
)

【问题讨论】:

    标签: batch-file batch-processing


    【解决方案1】:

    parkydr 提供了有关您收到错误原因的正确诊断 - 以 0 为前缀的数字被解释为八进制。

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

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

    编辑

    %%c0809 时,上述解决方案并未直接解决SET /A 的故障。我上面的解决方案假定 /A 选项已被删除。

    cam 变量可以完全消除:

    if "%%c" leq "08" ...
    

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

    if %%c leq 08 ...
    

    请参阅Rules for how CMD.EXE parses numbers 了解更多信息。有一个部分专门介绍 IF 语句。

    【讨论】:

    • 那么如何解释例如 07 的 cam 中的值呢?当然 leq 需要数字比较,所以它会尝试再次将“08”变成数字,即八进制?
    • @deed02392 - 不,LEQ 不需要数值。如果任一侧包含非数字字符,则进行基于字符串的比较而不是数字比较。 0 填充会导致比较给出正确的预期结果。
    • 这很有趣,我认为与两个字符串进行“小于”比较是不合逻辑的,因为您如何以与比较字符串的大小相同的方式量化字符串的大小两个十进制数?
    • @deed02392 - 想想字典如何按排序顺序列出单词。如果 word1 出现在 word2 之前,那么您可以说 word1 小于 word2。相同的基本概念用于比较我能想到的每种计算机语言中的字符串。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 2015-11-08
      • 2011-01-07
      • 2013-03-12
      • 2012-11-17
      • 2015-05-08
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多