Sådan bruger du Windows-batch til bicirculation

Indlæg af Hanne Mølgaard Plasc

Problem



to filer 1.txt 2.txt


1.txt


a2441

b4321

p8763


2.txt


Apple

banana

peach


Jeg vil gerne generere indhold i 12.bat


ren  a2441  Apple

ren b4321 banana

ren p8763  peach


Jeg forsøger at skrive sådan her men mislykkedes


@echo on

for /f \%\%a in (1.txt) do (
   for /f \%\%b in (2.txt ) do ( 
    ren \%\%a \%\%b>>12.bat  
      )  
     ) 

pause


Hvordan kan jeg opnå mine ønskede resultater? hjælp mig, thks

Bedste reference


Det er ikke så ligetil. Du skal springe over flere linjer i den indre sløjfe, men på grund af FOR parsing har du brug for yderligere subrutinopkald. Og hvis der er tomme foret, skal de fjernes med findstr for mere præcis springe af linjerne. Også spring argumentet i FOR accepterer ikke 0 så også en hvis er nødvendig.


@echo off

setlocal  ENABLEDELAYEDEXPANSION
set /a s=0
for /f "tokens=* delims=" \%\%a in (1.txt) do (

   call :inner !s!
   echo ren \%\%a !second!
   set /a s=s+1


) 
endlocal
pause
exit /b

:inner
set "second="
if \%1==0 (
    for /f "tokens=* delims=" \%\%b in ('findstr /r "[a-zA-Z]" "2.txt"') do ( 
        if not defined second set "second=\%\%b"
    )
) else (
    for /f "skip=\%1 tokens=* delims=" \%\%b in ('findstr /r "[a-zA-Z]" "2.txt"' ) do ( 
       if not defined second set "second=\%\%b"
    )
)

Andre referencer 1


Problemet med anidated loops er, at for hver linje i den ydre fil/loop behandles alle linjerne i den indre fil/loop.


En simpel løsning er at nummerere linjerne i begge filer og kun generere outputlinjen, når begge tal matcher. Hurtig og beskidt:


@echo off
    setlocal enableextensions disabledelayedexpansion

    >"12.bat" (
        for /f "tokens=1,* delims=:" \%\%a in ('findstr /n "^" 1.txt') do (
        for /f "tokens=1,* delims=:" \%\%c in ('findstr /n "^" 2.txt') do (
            if \%\%a==\%\%c (
                echo ren \%\%b \%\%d
            )
        ))
    )


Denne kode bruger kun findstr til at generere linjenumre (/n) for hver af de indgående filer og ved hjælp af delims og tokens klausulerne i kommandoen for /f at adskille dem fra de originale linieindhold (Bemærk: hvis linjerne kunne starte med et kolon, er der brug for mere kode). Hvis linjenummeret i den første fil matcher linjenummeret i anden fil kommandoen echoed (der er en aktiv output omdirigering til den endelige fil)


En anden mulighed er at tildele hver fil til en input stream og at læse dem ved hjælp af set /p operationer fra hver af strømmen


@echo off
    setlocal enableextensions disabledelayedexpansion

    call :processFiles 9<"1.txt" 8<"2.txt" >"12.bat" 
    goto :eof

:processFiles
        <&9 set /p f1= || goto :eof
        <&8 set /p f2= || goto :eof
        echo ren \%f1\% \%f2\%
        goto :processFiles


I call til underrutinen tildeler vi hver fil til en strøm. Inden i underrutinen læses hver strøm med set /p (note: set /p kan ikke læse linjer længere end 1021 tegn)