Få tilfældig linje fra tekstfil i Windows-batch

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg arbejder på et Windows-batch script. Jeg fandt en måde at indstille en variabel på en tilfældig linje fra en tekstfil. Det er klumpen, der starter ved linje 4 og ekkoer !current\_proxy!.


Jeg forsøgte at kopiere denne klump til en anden del af batchfilen (sektionen med det store tomme rum omkring det), så jeg kunne få en anden tilfældig linje, hvis/når en bestemt fil ikke kunne downloade. Hvorfor arbejder det ikke denne gang? Bruger jeg de forkerte symboler (f.eks. \% og !? Tak.


@echo off
setlocal EnableDelayedExpansion

set proxies\_list="proxies.txt"

:: # Count the number of lines in the text file and generate a random number.
for /f "usebackq" \%\%c in (`find /V /C "" ^< \%proxies\_list\%`) do set lines=\%\%c
set /a random\_number=\%RANDOM\% * lines / 32768 + 1, skiplines=random\_number-1

:: # Extract the line from the file.
set skip=
if \%skiplines\% gtr 0 set skip=skip=\%skiplines\%
for /f "usebackq \%skip\% delims=" \%\%c in (\%proxies\_list\%) do set "current\_proxy=\%\%c" & goto continue
:continue

echo/!current\_proxy!



for \%\%a in (xml*.xml) do (

   for /l \%\%b in (0,1,337) do (

      set /a "x=\%\%b\%\%26"
      set /a "y=\%\%b/26"
      set /a "tile\_number=\%\%b+1"

      if not exist "C:UsersUserDesktoppanoid	iles\%\%~na\%\%~na\_tile!tile\_number!.jpg" (

         echo C:^Users^User^Desktop^panoid^	iles^\%\%~na^\%\%~na\_tile!tile\_number!.jpg
         "C:Portable programswget64.exe" --read-timeout=10 --tries=3 -e use\_proxy=on -e http\_proxy=!current\_proxy! -O "C:UsersUserDesktoppanoid	iles\%\%~na\%\%~na\_tile!tile\_number!.jpg" "http://updatethis.com"


         FOR /F "usebackq" \%\%d IN ("C:UsersUserDesktoppanoid	iles\%\%~na\%\%~na\_tile!tile\_number!.jpg") DO set size=\%\%~zd

         if !size! GTR 0 (
            echo File not empty.
         ) ELSE (
            echo File empty.






            for /f "usebackq" \%\%c in (`find /V /C "" ^< \%proxies\_list\%`) do set lines=\%\%c
            set /a random\_number=\%RANDOM\% * lines / 32768 + 1, skiplines=random\_number-1
            set skip=
            if \%skiplines\% gtr 0 set skip=skip=\%skiplines\%
            for /f "usebackq \%skip\% delims=" \%\%c in (\%proxies\_list\%) do set "current\_proxy=\%\%c" & goto continue
            :continue
            echo/!current\_proxy!






         )


      )
   )
)

pause

Bedste reference


Her er et eksempel for at vise dig, at Call :label kan hjælpe.


Dette bruger en lidt anderledes metode, idet den indstiller hver linje i \%proxlist\% til en variabel i starten. Det er især fordelagtigt, hvis listen ikke er stor .


@Echo Off

Set "proxlist=proxies.txt"

For /F "Tokens=1* Delims=:" \%\%a In ('FindStr/N "^" "\%proxlist\%"') Do (
    Set "line[\%\%a]=\%\%b"
    Set "total=\%\%a"
)

Call :SetRand
Echo=\%randline\%

Call :SetRand
Echo=\%randline\%

Call :SetRand
Echo=\%randline\%

Timeout -1
Exit/B

:SetRand
Set/A "rand=(\%RANDOM\%\%\%total)+1"
Call Set "randline=\%\%line[\%rand\%]\%\%"


Når du har brug for en anden tilfældig linje, skal du bare ringe til sektionen af ​​dit script, hvilket gør det og vende tilbage til punktet lige efter kommandoen Call.