script how concatenate commands batch bat batch-file increment delayedvariableexpansion concat

batch-file - commands - how to concatenate in batch file



Las variables no se comportan como se esperaba (1)

No eres el primero en caer en la famosa "trampa de expansión retrasada" (y no serás el último).

Necesita expansión retrasada si desea usar una variable que haya cambiado en el mismo bloque (un bloque es una serie de comandos entre paréntesis ( y ) ).

Las variables retrasadas se referencian con !var! en lugar de %var% .

La razón es la forma, cmd analiza el código. Una línea o bloque completo se analiza de una vez, reemplazando las variables normales con su valor en el momento del análisis. Las variables retrasadas se evalúan en tiempo de ejecución.

Dos archivos por lotes simples para demostrar:

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

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

Nota : Una línea también se trata como un bloque:

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

Con expansión retrasada:

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

La expansión retrasada está desactivada por defecto en el símbolo del sistema. Si realmente lo necesita, puede hacer:

cmd /V:ON /C "set "var=hello" & echo !var!"

También hay una manera de hacer lo mismo sin una expansión retrasada (pero la call cuesta algún tiempo, por lo que es más lenta, pero si por alguna razón no puede / no quiere usar la expansión retrasada, es una alternativa):

setlocal DISabledelayedexpansion for /L %%i in (1 1 5) do ( call echo %random% %%random%% )

Ambos métodos también se pueden usar para mostrar variables de tipo matriz :

(Esto a menudo se pregunta como "variable que contiene otra variable" o "variables anidadas")

Aquí hay una colección para usar tales variables tipo matriz en diferentes situaciones:

Con expansión retrasada:

setlocal ENableDelayedExpansion set "num=4" set "var[%num%]=HELLO" echo plain delayed: !var[%num%]! for /L %%i in (4 1 4) do ( echo for delayed: !var[%%i]! set a=%%i call echo for delayed with variable: %%var[!a!]%% )

sin expansión retrasada:

setlocal DISableDelayedExpansion set "num=4" set "var[%num%]=HELLO" call echo plain called: %%var[%num%]%% for /L %%i in (4 1 4) do ( call echo FOR called: %%var[%%i]%% set a=%%i call echo FOR called with variable: %%var[%a%]%% )

Nota : setlocal no tiene ningún efecto fuera de los archivos por delayedexpansion , por lo que la delayedexpansion solo funciona:
- En archivos por lotes
- Cuando se inició el cmd con la expansión retrasada habilitada ( cmd /V:ON ) (de forma predeterminada, el cmd se ejecuta con la expansión retrasada deshabilitada)

He estado luchando tratando de obtener la sintaxis correcta en este archivo por lotes y no puedo entender por qué algunas cosas no funcionan.

  1. La variable i no se incrementa cada vez que lo hago.
  2. La concatenación en strc no parece concatenarse.

Aquí está mi código:

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