c-az-h
Goto Top

Parameterübergabe in Schleife

Braeuchte Hilfe, da anscheinend meinerseits ein Verstaendnissproblem bei der Parameterübergabe besteht.

Folgend der Quelltext meines kleinen Programms, welches eine 3er Zahlenkombination ausführen soll (unterschiedliche), jedoch nicht, wenn die Führende eine 0 ist, und nur die Null zwei mal in Folge auftreten darf.
Dies wird in eine Datei geschrieben, und nun sollte, wenn die Dateigröße größer 10 KB wird, eine Neue Datei angelegt werden. Es wird aber sofort, wenn die 10 KB der ersten Datei erreicht sind, für jeden folgenden Eintrag eine Datei erstellt, was mich vermuten läßt das immerwieder nur nach der ersten Datei geschaut wird.
@echo off & setlocal
SET M=0 1 2 3 4 5 6 7 8 9
SET N=0
SET X="Liste03%i%.txt"  
SET Size=10000
SET y=1

FOR %%a IN (%M%) DO (
 IF %%a NEQ 0 (
  FOR %%b IN (%M%) DO (
   FOR %%c IN (%M%) DO (
    :weiter
    IF %%a NEQ %%b IF %%b NEQ %%c (
     ECHO %%a%%b%%c>>%X%
    )
    FOR %%z IN (%N%) DO (
     IF %%z EQU %%c IF %%a NEQ %%b IF %%a NEQ 0 (
      ECHO %%a%%b%%c>>%X%
     )
    )
    FOR %%j IN (%X%) DO (
     IF %%~zj GEQ %Size% (
     GOTO var
     )
    )
   )
  )
 )
)

:var
SET /A y+=1
rem echo %y%
SET X="Liste03%y%.txt"  
GOTO weiter

[Edit Biber] Codeformatierung. [/Edit]

Content-Key: 178792

Url: https://administrator.de/contentid/178792

Printed on: April 16, 2024 at 04:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Jan 12, 2012 at 11:58:23 (UTC)
Goto Top
moin c-az-h,
wir Begrüßen uns meist.

Du schreibst doch aber pro Zeile nur 5 Byte wieso kommst Du bei 890 (891) Zeilen auf über 10 kB?
(for /l %i in (101 1 999) do @echo %i)|findstr /v 00 >datei.txt
Existieren die Liste*.txt schon?

Der Sprung aus der Forschleife wird zwar gemacht, aber der Sprung hinein geht nicht mehr, und die Klammern stimmem nicht mehr.
Die Marke :Weiter befindet sich zu diesem Hingang nicht mehr in einer Schleife.
Danach wird der Rest der Schleife ganz normal ausgeführ und die Datei wird mit dem Rest Vollgeschrieben.

Vieleicht ist es Besser die Größe der Ausgabedatei vorher zu bestimmen und von der Endgröße diesen Wert abzuziehen Durch 5 zu teilen und dieses Ergebnis anstatt dem Endwert in der For /L Schleife einzufügen.
Ungetestet
@echo off &setlocal
set /a Anfang = 101
set /a Ende = 999

set Name=D:\Liste03
set /a Nr = 0
set Ext=.txt

set /a Size = 10000

:begin
set /a Nr +=1
for %i in (%Name%%Nr%%ext%) do set /a FSize=%~zi
set /a FEnde = Ende - (Size - Fsize) / 5
if %Fende% gtr %ende% set /a Fende = Ende

(for /l %%i in (%Anfang% 1 %FEnde%) do @echo %%i)|findstr /v 00 1>>"%Name%%Nr%%ext%"  
set /a Anfang = FEnde

if %FEnde% neq %Ende% goto :begin
[edit]
Variable berichtigt
[/edit]
Gruß Phil
Member: c-az-h
c-az-h Jan 12, 2012 at 13:37:49 (UTC)
Goto Top
Hallo Phil,

danke für die Antwort.
Ich habe das Skript für die Anfrage hier etwas gekürzt, da es sonst eigentlich eine Permutation über die Zahlen und das Alphabet machen soll -> was dann mehr als die 10 KB sind.
Deinen Vorschlag probiere ich mal aus.

Mal sehen wie weit ich komme, auch wenn ich das Problem mit der Sprungmarke nur als gegeben hin nehmen kann, da ich dachte, der Code wird so ausgeführt, wie er da steht, und nicht das eine Konsistenzprüfung stattfindet, ob die Schleife schon geschlossen ist.

Gruß - CA
Member: pieh-ejdsch
pieh-ejdsch Jan 12, 2012 at 13:41:52 (UTC)
Goto Top
verstehe nur nicht, warum Du die Variable "Beginn" setzt
Schusselfehler! sollte Anfang heisen.

Die Schleife bleibt ja so wie sie ist und wird bis zum Schluss durchgezogen (wenn ein goto :eof in Zeile 30 wäre).
So bleibt Die Schleife offen genau an der Zahl, welche zuletzt geschrieben wurde.

Der Denkfehler liegt im Goto :SprungMarke in der Schleife.
Das GOTO macht was es soll - es wird jede nachfolgende Zeile des Batches nach der :SprungMarke durchsucht.
Wird diese nicht gefunden wird von vorne neu Angefangen mit suchen dieser Marke.
In Zeile 12 Deines Batches ist die Marke und danach wird normal verglichen
if %a NEQ %b usw...
doppelte Prozente werden zu einem und %a%b%c steht in jeder neuen Datei

Die Schließende Klammer macht als Befehl aber keine Fehlermeldung oder anderes.
Dann kommt der Vergleich der Größe der neuen Datei (die Variablen werden ja normal Aufgelöst) und weil das goto :eof in Zeile 30 Fehlt kommt der Batch irgendwann wo an ?
:var
wäre goto :eof da würde der Rest der Forschleife ausgeführt werden aber trotzdem den Rest der Zahlen in die 1. Datei schreiben, weil in der Schleife die Variable X noch die vom Anfang ist.

und da geht der Kreis wieder von vorn los.

Gruß Phil
Member: pieh-ejdsch
pieh-ejdsch Jan 12, 2012 at 22:38:09 (UTC)
Goto Top
Den KilometerZähler könntest Du zumindest Einfacher gestalten:
@echo off &setlocal
set "Index=0 1 2 3 4 5 6 7 8 9 a b c - z"  

set /a KeySize = 7

set /a size =10000

set /a Lines = size /( KeySize +2 )
set /a ISize = 1

for %%i in (%index:~2%) do set "Key=%%i" &call :begin  
goto :eof

:begin
set /a ISize +=1
for %%j in (%index%) do if %ISize% equ %KeySize% (echo(%Key%%%j) else (set "Key=%Key%%%j"&call :begin)  
set /a ISize -= 1&goto :eof

Gruß Phil
Member: c-az-h
c-az-h Jan 13, 2012 at 14:40:49 (UTC)
Goto Top
Hallo Phil,

danke für die Hinweise.
Habe herausgefunden, das es ein Klammerproblem zu sein scheint.
Habe es nun so gelöst, daß bei erreichen einer bestimmten Größe, eine weitere Datei aufgerufen wird, die durchzählt wieviel Textdateien da sind, und dann die vorhandene einfach umbenennt.

Markiere den Fall dann als gelöst.

Danke - CA