windows - Sådan tæller du arrayer i FOR-sløjfer ved hjælp af en variabel som indeks?

Indlæg af Hanne Mølgaard Plasc

Problem



Okay. Jeg blev af med de fleste af den ubrugelige kode og har tinker med det her og der og forsøger at finde ud af, hvad der er problemet, og jeg tror jeg endelig fandt det:


Windows 'Batch kan' ikke redigere variabler, der vil blive udvidet, hvis de er inde i en FOR loop.


Eks:


set /a x=1
Powershell Get-Clipboard> \%temp\%ffmpeglist.txt
setlocal enableExtensions enableDelayedExpansion
for /F "delims=| tokens=*" \%\%A in (\%temp\%ffmpeglist.txt) do (
    set input[!x!]=\%\%A
    call echo !input[\%x\%]!
    set /a x += 1
)
endlocal


Forventet opførsel:


g:videosyoutube1.mp4
g:videosyoutube2.mp4
g:videosyoutube3.mp4
g:videosyoutube4.mp4
g:videosyoutube5.mp4


Hvad jeg får:


g:videosyoutube1.mp4
g:videosyoutube1.mp4
g:videosyoutube1.mp4
g:videosyoutube1.mp4
g:videosyoutube1.mp4


Ligegyldigt hvad jeg gør, set /a x+= 1 ændrer ikke værdien af ​​x.


Er der løsninger? Jeg er åben for noget.

Bedste reference


EDIT


I dit stærkt ændrede parti (faktisk et nyt spørgsmål) ændres


 call echo !input[\%x\%]!


til


 call echo \%\%input[!x!]\%\%





Hvis i en (kodeblok) du muligvis har brug for forsinket ekspansion for at tvinge de faktiske værdier,
hvis du samtidig bruger en indekseret variabel, har du brug for et andet niveau af forsinket ekspansion, du kan opnå med et pseudoopkald og fordoblet procent tegn


Call set Input=\%\%input[!x!]\%\%
mediainfo --Output=Video;\%\%Height\%\% !input! > \%temp\%ffmpegres\%x\%.txt

Andre referencer 1


Takket være @Aacini og @LotPings, er jeg kommet til svaret:


set /a x=1
Powershell Get-Clipboard> \%temp\%ffmpeglist.txt
setlocal enableDelayedExpansion
for /f "delims=|" \%\%A in (\%temp\%ffmpeglist.txt) do (
    set input[!x!]="\%\%A"
    for \%\%i in (!x!) do echo !input[\%\%i]!
    set /a x =+ 1
)


Problemet var ikke, at BATCH ikke kunne



  rediger variabler, der vil blive udvidet, hvis de er inde i en FOR loop.



Men det gør det på en ikke meget ligefrem måde.