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.
-
La variable
i
no se incrementa cada vez que lo hago. -
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