2015-05-17 13 views
9

Ich habe Wrestling versucht, um die Syntax richtig auf diese Batch-Datei zu bekommen, und ich kann nicht für das Leben von mir herauszufinden, warum einige Dinge nicht funktionieren.Variablen im Batch verhält sich nicht wie erwartet

1) Die Variable 'i' wird nicht inkrementiert. und 2) Verkettung auf strc scheint nicht zu wollen ... gut, verketten.

set i=0 
set "strc=concat:" 

for %%f in (*.mp4) do (
    set /a i+=1 
    set "str=intermediate%i%.ts" 

    set strc="%strc% %str%|" 

    ffmpeg -i "%%f" -c copy -bsf:v h264_mp4toannexb -f mpegts "%str%" 
) 

set strc="%strc:-1%" 
ffmpeg -i "%strc%" -c copy -bsf:a aac_adtstoasc Output.mp4 

Antwort

20

Sie sind nicht der erste, der in den berühmten fiel „verzögerte Expansion trap“ (und Sie werden das letzte nicht sein)

Sie benötigen eine verzögerte Expansion, wenn Sie eine Variable verwenden möchten, dass Sie hat sich im gleichen Block (ein Block eine Reihe von Befehlen in Klammern ist ( und ))

Delayed Variablen mit !var! stattdessen referenziert werden von %var%

Grund ist die Weg, cmd analysiert den Code. Eine vollständige Zeile oder ein vollständiger Block wird sofort analysiert und ersetzt normale Variablen durch ihren Wert zur Parserzeit. Verzögerte Variablen werden zur Laufzeit ausgewertet.

Zwei einfache Chargen zu demonstrieren:

setlocal enabledelayedexpansion 
set "var=hello" 
if 1==1 (
    set "var=world" 
    echo %var% !var! 
) 

.

for /L %%i in (1,1,5) do (
    echo %random% !random! 
) 

Anmerkung: auch eine Linie als ein Block behandelt:

set "var=old" 
set "var=new" & echo %var% 

mit verzögerter Expansion:

setlocal enabledelayedexpansion 
set "var=old" 
set "var=new" & echo !var! 

Verzögerte Expansion per Standardeinstellung ist an der Eingabeaufforderung ausgeschaltet. Wenn Sie es wirklich brauchen, können Sie tun:

cmd /v:on /c "set "var=hello" & echo !var!" 
+0

Sein großes, wenn Sie etwas mehr Details :) –

+1

@NayanaAdassuriya hinzufügen könnte: Die meisten Menschen mögen nicht über die [Technischer Hintergrund] (http lesen: // blogs .msdn.com/b/oldnewthing/archive/2006/08/23/714650.aspx) oder sogar das [fortgeschrittene technische Zeug] (http://stackoverflow.com/q/4094699/2152082) – Stephan