Batchscript-lus

Ik moet een opdracht 100-200 keer uitvoeren, en tot nu toe heeft mijn onderzoek uitgewezen dat ik ofwel 100 exemplaren van deze opdracht moet kopiëren/plakken OF een for-lus moet gebruiken, maar de forloop verwacht een lijst met items, daarom zou ik 200 bestanden nodig hebben om te werken, of een lijst van 200 items, om het punt te verslaan.

Ik zou liever geen C-programma hoeven te schrijven en uitgebreid moeten documenteren waarom ik een ander programma moest schrijven om mijn programma uit te voeren voor testdoeleinden. Aanpassing van mijn programma zelf is ook geen optie.

Dus, gegeven een commando, a, hoe zou ik het Nkeer uitvoeren via een batchscript?

Opmerking: ik wil geen oneindige lus

Dit is bijvoorbeeld hoe het eruit zou zien in Javascript:

var i;
for (i = 0; i < 100; i++) {
  console.log( i );
} 

Hoe zou het eruit zien in een batchscript dat op Windows wordt uitgevoerd?


Antwoord 1, autoriteit 100%

FOR /Lis je vriend:

for /l %x in (1, 1, 100) do echo %x

Begint bij 1, stap voor stap en eindigt bij 100.

Gebruik twee %s als het in een batchbestand staat

for /l %%x in (1, 1, 100) do echo %%x

(wat een van de dingen is waar ik echt een hekel aan heb aan Windows-scripting)

Als je meerdere opdrachten hebt voor elke iteratie van de lus, doe dit dan:

for /l %x in (1, 1, 100) do (
   echo %x
   copy %x.txt z:\whatever\etc
)

of in een batchbestand

for /l %%x in (1, 1, 100) do (
   echo %%x
   copy %%x.txt z:\whatever\etc
)

Sleutel:
/lgeeft aan dat de opdracht forop een numerieke manier zal werken, in plaats van op een set bestanden
%xis de loops-variabele
(beginwaarde, toename van waarde, eindvoorwaarde [inclusief] )


Antwoord 2, autoriteit 12%

En om de bestanden van een map te herhalen:

@echo off 
setlocal enableDelayedExpansion 
set MYDIR=C:\something
for /F %%x in ('dir /B/D %MYDIR%') do (
  set FILENAME=%MYDIR%\%%x\log\IL_ERROR.log
  echo ===========================  Search in !FILENAME! ===========================
  c:\utils\grep motiv !FILENAME!
)

U moet “enableDelayedExpansion” en !FILENAME! in plaats van $FILENAME$. In het tweede geval interpreteert DOS de variabele slechts één keer (voordat deze in de lus komt) en niet elke keer dat het programma wordt herhaald.


Antwoord 3, autoriteit 6%

Sjabloon voor een eenvoudige maar getelde lus:

set loopcount=[Number of times]
:loop
[Commands you want to repeat]
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop

Voorbeeld: zeg “Hallo wereld!” 5 keer:

@echo off
set loopcount=5
:loop
echo Hello World!
set /a loopcount=loopcount-1
if %loopcount%==0 goto exitloop
goto loop
:exitloop
pause

Dit voorbeeld geeft het volgende weer:

Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Press any key to continue . . .

Antwoord 4

U kunt dit ook proberen in plaats van een for-lus:

set count=0
:loop
set /a count=%count%+1
(Commands here)
if %count% neq 100 goto loop
(Commands after loop)

Het is vrij klein en ik gebruik het altijd.


Antwoord 5

Je zou iets met het volgende effect kunnen doen door de FOR-lus te vermijden.

set counter=0
:loop
echo "input commands here"
SET /A counter=%counter%+1
if %counter% GTR 200
(GOTO exit) else (GOTO loop)
:exit
exit

Antwoord 6

Of u kunt een variabele verlagen/verhogen met het aantal keren dat u wilt herhalen:

SETLOCAL ENABLEDELAYEDEXPANSION
SET counter=200
:Beginning
IF %counter% NEQ 0 (
echo %x
copy %x.txt z:\whatever\etc
SET /A counter=%counter%-1
GOTO Beginning
) ELSE (
ENDLOCAL
SET counter=
GOTO:eof

Het is duidelijk dat het gebruik van FOR /Lde snelweg is en dit is de zijstraat die langer duurt, maar dezelfde bestemming bereikt.


Antwoord 7

U kunt dit doen zonder een for-instructie ^.^:

@echo off
:SPINNER
SET COUNTP1=1
:1
CLS
 :: YOUR COMMAND GOES HERE
IF !COUNTP1! EQU 200 goto 2
SET COUNTP1=1
) ELSE (
SET /A COUNTP1+=1
)
goto 1
:2
:: COMMAND HAS FINISHED RUNNING 200 TIMES

Het heeft basiskennis. Test het maar eens uit. 😛


Antwoord 8

Zeer eenvoudige manier om looping te implementeren in cmd-programmering met behulp van labels

@echo off
SET /A "index=1"
SET /A "count=5"
:while
if %index% leq %count% (
   echo The value of index is %index%
   SET /A "index=index + 1"
   goto :while
)

Antwoord 9

DOS biedt hiervoor geen erg elegante mechanismen, maar ik denk dat je met redelijke inspanning nog steeds een lus voor 100 of 200 iteraties kunt coderen. Hoewel er geen numerieke for-lus is, kunt u een tekenreeks gebruiken als een “loopvariabele”.

Codeer de lus met GOTO, en gebruik voor elke iteratie SET X=%X%@om nog een @-teken toe te voegen aan een omgevingsvariabele X; en om de lus te verlaten, vergelijkt u de waarde van X met een reeks van 100 (of 200) @-tekens.

Ik heb nooit gezegd dat dit elegant was, maar het zou moeten werken!


Antwoord 10

Ik weet niet zeker of een dergelijk antwoord al is ingediend, maar je zou zoiets als dit kunnen proberen:

@echo off
:start
set /a var+=1
if %var% EQU 100 goto end
:: Code you want to run goes here
goto start
:end
echo var has reached %var%.
pause
exit

De variabele %var% zal met één toenemen totdat deze 100 bereikt, waarna het programma aangeeft dat het klaar is met uitvoeren. Nogmaals, ik weet niet zeker of dit is ingediend of iets dergelijks, maar ik denk dat dit de meest compacte is.


Antwoord 11

Ik gebruik dit. Het is ongeveer hetzelfde als de andere, maar het is gewoon een andere manier om het op te schrijven.

@ECHO off
set count=0
:Loop
if %count%==[how many times to loop] goto end
::[Commands to execute here]
set count=%count%+1
goto Loop
:end

Antwoord 12

Het antwoord hangt echt af van hoe bekend je bent met batch, als je niet zo ervaren bent, zou ik aanraden om een lusvariabele te verhogen:

@echo off
set /a loop=1
:repeat
echo Hello World!
set /a loop=%loop%+1
if %loop%==<no. of times to repeat> (
goto escapedfromrepeat
)
goto repeat
:escapedfromrepeat
echo You have come out of the loop
pause

Maar als je meer ervaring hebt met batchen, zou ik aanraden dat de meer praktische for /l %loop in (1, 1, 10) do echo %loopde betere keuze is.

            (start at 1, go up in 1's, end at 10)
for /l %[your choice] (start, step, end) do [command of your choice]

Antwoord 13

Hier is een sjabloonscript dat ik zal gebruiken.

@echo off
goto Loop
:Loop
<EXTRA SCRIPTING HERE!!!!>
goto Loop
exit

Wat dit doet, is dat wanneer het start, het de echo uitschakelt en daarna de “Loop” uitvoert, maar op die plaats blijft het in “Loop” gaan (ik hoop dat dit helpt.)


Antwoord 14

een volledig foutloze lus

set num=0
:loop
:: insert code
set num=%num%+1
if %num% neq 10 goto loop
::insert after code code

je kunt het bewerken door de 10 in regel 5 te veranderen in een willekeurig getal om aan te geven hoe vaak je het wilt herhalen.


Antwoord 15

(BEWERKT) Ik heb het zo gemaakt dat het na 100 keer stopt

@echo off
goto actual
set /a loopcount=0
:actual
set /a loopcount=%loopcount% + 1
echo %random% %random% %random% %random%
timeout 1 /nobreak>nul
if %loopcount%== 100 goto stop
goto actual
:stop
exit

Dit genereert 100 keer 4 willekeurige getallen per seconde.
Haal de “time-out 1 /nobreak>nul” weg om het supersnel te laten gaan.


Antwoord 16

Ik heb 2 antwoorden
Methoden 1:
Javascript invoegen in batch

@if (@a==@b) @end /*
:: batch portion
@ECHO OFF
cscript /e:jscript "%~f0"
:: JScript portion */
Input Javascript here

(Ik weet niet veel over JavaScript)

Methode 2:
Loop in batch

  @echo off
    set loopcount=5
    :loop
    echo Hello World!
    set /a loopcount=loopcount-1
    if %loopcount%==0 goto exitloop
    goto loop
    :exitloop
    pause

(Bedankt FluorescentGreen5)

Other episodes