2015-06-06 91 views
1

我想寫一個簡單的批處理文件。這個批處理文件有什麼問題?

「encoded _ %% A _ %% B_%int%%conv% %% E」是必需的輸出文件名。有人能告訴我,爲什麼「int」和「conv」永遠不會出現在名稱中?它把它們視爲不存在......爲什麼?

FOR %%A IN (4k, 8k) DO FOR %%B IN (7, 8) DO FOR %%C IN (1/32, 1/4) DO FOR %%D IN (2/3, 5/6) DO FOR %%E IN (4, 64) DO (
if %%C==1/32 (set int=132) else (set int=14) 
if %%D==2/3 (set conv=23) else (set conv=56) 
dvbtenco -i zad1.m2v -o encoded_%%A_%%B_%int%_%conv%_%%E -m %%A -M %%E -p %%D -D %%C -b %%B -d t 
timeout /t 10 

) 
+2

需要延遲擴展 - http://ss64.com/nt/delayedexpansion.html – npocmaka

+0

沒有直接回答這個問題,而是:你知道,幾乎所有的Windows版本支持Windows腳本宿主? Wsh允許您使用JavaScript,並且可以與批處理文件一起使用。它可以是替代品,也可以從批次中調用wsh。 – Marged

+0

@npocmaka - 延期擴展幫助,謝謝。 –

回答

1

npocmaka在他的評論中有明顯的解決方案 - 使用延遲擴展。

但是有一個不太明顯的解決方案可以避免延遲擴展。它只需要兩個FOR循環。

/通常(但不總是)代名詞\與路徑處理時,所以1/32\..是邏輯上等同於1。您可以使用~n修飾符來獲取包含在FOR變量中的規範化名稱,而不包含路徑。

FOR %%A IN (4k, 8k) DO FOR %%B IN (7, 8) DO FOR %%C IN (1/32, 1/4) DO FOR %%D IN (2/3, 5/6) DO FOR %%E IN (4, 64) DO (
    for %%c in (%%C\..) do for %%d in (%%D\..) do (
    dvbtenco -i zad1.m2v -o encoded_%%A_%%B_%%~nc%%~nC_%%~nd%%~nD_%%E -m %%A -M %%E -p %%D -D %%C -b %%B -d t 
) 
    timeout /t 10 
)