2013-02-07 76 views
0

我試圖通過批量使用循環來生成腳本以在多個視頻卡輸入上運行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

parkydr提供了正確的診斷,爲什麼你會得到錯誤 - 以0爲前綴的數字被解釋爲八進制。

有一個簡單的解決方案 - 將右側更改爲08,並在比較的兩側添加非數字字符以強制字符串比較而不是數字比較。這些值正確排序爲字符串,因爲它們的零填充長度都相同。我喜歡用引號,但幾乎任何角色都會用。

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

EDIT

溶液上面不能直接解決的SET /A失敗時%%c0809。我上面的解決方案假定/A選項已被刪除。

cam變量可以完全被消除:即使更好的是,不需要

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

額外非數字字符(S),因爲IF看到08爲無效八進制,缺省值爲字符串比較。

if %%c leq 08 ... 

有關更多信息,請參見Rules for how CMD.EXE parses numbers。有一節專門討論IF聲明。

+0

那麼如何解釋07的凸輪值呢?當然leq需要數字比較,所以它會嘗試再次將「08」變成一個數字,即八進制? – deed02392

+0

@ deed02392 - 不,LEQ不需要數字值。如果任何一方包含一個非數字字符,則會執行基於字符串的比較而不是數字比較。 0填充會導致比較結果提供正確的預期結果。 – dbenham

+0

這非常有趣,我不認爲用兩個字符串進行'少於'的比較是合乎邏輯的,因爲如何以相同的方式量化字符串的大小以比較兩個十進制數的大小? – deed02392

2

數字與領先的零被解釋爲八進制(如0X表示十六進制),這樣08和09都是不好的八進制值。