2015-05-17 47 views
9

Sono stato wrestling cercando di ottenere la sintassi corretta su questo file batch e non posso per la vita di me capire perché alcune cose non funzionano.Variabili in batch non si comportano come previsto

1) La variabile "i" non viene incrementata. e 2) La concatenazione su strc non sembra voler ... beh, concatenare.

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 

risposta

20

Non sei il primo, che è caduto nella famosa "ritardata trappola espansione" (e non sarà l'ultima)

Hai bisogno di espansione ritardata se si desidera utilizzare una variabile, che è stata modificata nello stesso blocco (blocco è una serie di comandi tra parentesi ( e ))

variabili differiti sono referenziati con !var! anziché %var%

ragione è way, cmd analizza il codice. Una riga o un blocco completo viene analizzato in una sola volta, sostituendo le variabili normali con il loro valore in fase di analisi. Le variabili ritardate vengono valutate in fase di runtime.

Due semplici lotti per dimostrare:

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! 
) 

Nota: anche una riga viene trattata come un blocco:

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

con espansione ritardata:

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

espansione ritardata è per difetto spenta al prompt dei comandi. Se si ha realmente bisogno, si può fare:

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

Il suo bello se si potesse aggiungere po 'di più i dettagli :) –

+1

@NayanaAdassuriya: la maggior parte delle gente non piace leggere circa il [background tecnico] (http: // blogs .msdn.com/b/oldnewthing/archive/2006/08/23/714650.aspx) o persino [materiale tecnico avanzato] (http://stackoverflow.com/q/4094699/2152082) – Stephan