Batch Wie macht man eine Schleife -_- | Daten einem Python Script übergeben

Schattenfänger

Lt. Junior Grade
Dabei seit
Nov. 2010
Beiträge
257
Ich bin hier jetzt bereits zwei Stunden bei dem kleinen Dreck dabei und ich habe keine Ahnung was falsch läuft.
Ich habe die ganzen Dinger von Tutorials zusammengesteckt aber irgendwie geht es trotzdem nicht.
Entweder wird cmd nicht geöfnet oder sofort wieder geschlossen.

Ich sende Strings zu einem Python Programm.

Code:
set directory=results
set results[0]=daten
set results[1]=....
Start "Update Results" calculate.py %results[0]% -i -b -d %directory%

Dieses komplizierte Skript funktioniert. Aber ich möchte mehrere Daten ausgeben und brauche eine schleife.


Ich habe es bereits mit GOTO und /l und /a probiert aber irgendwie funktioniert der Dreck nie.

Also, kann mir bitte jemand zeigen wie dieses Skript aussehen muss, wenn ich über das Array interieren möchte? Gerne schreibe ich die Daten auch in eine eigene Datei, /f wäre damit also auch okay.
 

maloz

Commander
Dabei seit
März 2007
Beiträge
2.855
Beginne doch mal damit dein ganzes Batch Script hier zu posten, dann sieht man vielleicht, was falsch läuft.

Dann eine grundsätzliche Frage: Warum machst du nicht gleich "alles" in einem Python Script?
 

MichiSauer

Commander
Dabei seit
Feb. 2008
Beiträge
2.598
Das ist die richtige Frage, Khaos.

Ich würde auch alles im Python-Script machen und nur das Endergebnis zurückgeben. Sollte normalerweise den gesamten Ablauf stark vereinfachen.
 

Schattenfänger

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
257
Hallo, ist nicht mein Script und er Autor will zZ nichts hinzufügen, da er es komplett überarbeitet aber bis dahin kann es noch dauern.
Wobei ich inzwischen glaube, dass ein Fork und die jeweiligen Teile zu ändern wäre schneller für mich gewesen.


Code:
@echo off
SET saveDirectory=completeResults

SET "directory=%saveDirectory%" "(%date:~-4%-%date:~-7,2%-%date:~-10,2%--%time:~-11,2%-%time:~-8,2%-%time:~-5,2%)\"


SET results[0]=tollerString
SET results[1]=anderertollerString

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

set x=0
if %x% == 0 (
echo 4
)
set x=0
:urlLoop
if %x% LSS 2 (
START "Update Results" calculate.py  results[0] -i -b  -t  -d %directory%
set /A x=x+1
GOTO urlLoop
)

Ich habe hier eben mehrere Schleifen drin, da ich probieren wollte ob eine andere funktioniert. Aber irgendwie startet das ganze Pprogramm nicht.
 

simpsonsfan

Commander
Dabei seit
Feb. 2008
Beiträge
2.936
Bitteschön:
Code:
@echo off
setlocal enabledelayedexpansion
set directory=results
set results[0]=daten
set results[1]=test
set results[2]=daten3
set results[3]=daten4
set results[4]=daten5
set results[5]=daten6

for /l %%i in (0,1,5) do (
echo Start "Update Results" calculate.py !results[%%i]! -i -b -d %directory%
)
Batch is a bitch. Das ist nunmal so. Mit der delayedexpansion klappt es. Und zwei Prozentzeichen in einem batchfile, ein Prozentzeichen beim händischen Tippen in die Konsole. Wobei sowas eigentlich relativ schnell zu finden sein sollte.
 

Schattenfänger

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
257
Hallo, danke, dass funktioniert, sobald man das echo vom Command entfernt. Ich bin mir ziemlich sicher, dass ich es bereits so hatte, nur ohne delayedexpansion.
Und ja, Batch nervt mich wirklich :D

Jetzt will ich dass, das Programm max 3x ausgeführ wird.
Aber das Programm startet erst gar nicht.
Code:
    IF %%i%%3==0(
        /WAIT
    )
Ich schätze, dass ich Wait nicht einfach so verwenden darf und nur in Zusammenhang mit einem COmmand aber ein sleep bringt mir ja auch nichts. Wie mache ich es dass, das Programm maximal n-mal zur gleichen Zeit ausgeführt wird?


Wie würde ich machen, wenn ich die Daten von einem File lesen möchte? Einfach nur /F zu verwenden funktioniert irgendwie nicht.
 

simpsonsfan

Commander
Dabei seit
Feb. 2008
Beiträge
2.936
Code:
for /l %%i in (0,1,5) do (
IF %%i==3 GOTO END
Start "Update Results" calculate.py !results[%%i]! -i -b -d %directory%
)
:END
Hier findest du auch noch eine Liste mit Batchbefehlen/-syntax.
Du hast mehrere Fehler da oben.
  1. Code:
    %%i%%3
    gibt dir deine Variable i gefolgt von "%3" aus. Das wird niemals "0".
  2. Dir fehlt ein Leerzeichen vor der Klammer beim IF.
  3. Wie du selbst geschrieben hast, hast du keinen Befehl namens "/WAIT".
 

Schattenfänger

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
257
Naja, bei deinem Beispiel endet die Schleife ja komplett nach vier Durchgängen, ich wollte, dass es alle drei Durchgänge wartet bis die Programme abgeschlossen sind.
Das "%%" sollte eigentlich der modulo sein.
 

simpsonsfan

Commander
Dabei seit
Feb. 2008
Beiträge
2.936
Modulo funktioniert wiederum nur mit "set /a", nicht einfach so.
Mit dem Abbruch hatte ich dich falsch verstanden. Dann teste mal Folgendes: Rufe in deiner Schleife zweimal dein python script mit "start" auf, und einmal einfach so, dann wartet die Batch jeweils auf den letzten Durchgang.
Oder schreib dir gleich was passenderes in Python.
 

Schattenfänger

Lt. Junior Grade
Ersteller dieses Themas
Dabei seit
Nov. 2010
Beiträge
257
urgh, danke.
Ich werd wohl einfach nen fork erstellen und in Python arbeiten.

Aber noch aus interesse. Wie muss ich die /f schreiben um die Daten von einem File zu lesen? Wenn ich einfach nur ein Beispiel aus dem Internet kopiere geht es mal wieder nicht.
 

simpsonsfan

Commander
Dabei seit
Feb. 2008
Beiträge
2.936
Du meinst, du wie du die "results" aus einer Liste in einer Datei lesen würdest? In etwa folgendermaßen:
Code:
setlocal enabledelayedexpansion
set /a j=0
for /f %%i in (liste.txt) do (
set "results[!j!]=%%i
set /a j=!j!+1
)

echo !results[0]!
echo !results[1]!
echo !results[2]!
Ansonsten könnte das Ganze mit "start /wait" so aussehen:
Code:
@echo off
setlocal enabledelayedexpansion
set /a j=1
for /f %%i in (liste.txt) do (
set "results[!j!]=%%i
set /a j=!j!+1
)

set /a max=%j%-1
set directory=results

for /l %%i in (1,1,%max%) do (
set /a j=%%i %% 3
if !j! == 0 (
echo start "Update Results" /wait calculate.py !results[%%i]! -i -b -d %directory%
) else (
echo Start "Update Results" calculate.py !results[%%i]! -i -b -d %directory%
)
)
 
Zuletzt bearbeitet:
Top