pipel1n3
Goto Top

Probleme mit zählervariable

Leider habe ich mit folgendem Script ein komisches Problem:

Hier das Script:
set wert=0
set zahl=1
set datei=proxyliste.txt
For /F "delims=" %%i IN ('TYPE %1') DO (  
IF %zahl%==10 (
set wert=1
)
IF %zahl%==100 (
set wert=2
)
IF %zahl%==1000 (
set wert=3
)
IF %wert%==0 (
echo 00%zahl%=%%i>>%datei%
)
IF %wert%==1 (
echo 0%zahl%=%%i>>%datei%
)
IF %wert%==2 (
echo %zahl%=%%i>>%datei%
)
set /A zahl+=1
echo %zahl%
Pause >nul
)
proxyliste.txt
exit
Trotz dem set /A zahl+=1 erhöht sich der Wert der Variablen nicht!
Bitte helft mir face-smile

Content-Key: 75570

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

Printed on: April 20, 2024 at 01:04 o'clock

Member: LordGurke
LordGurke Dec 09, 2007 at 13:47:25 (UTC)
Goto Top
Bin mir nicht sicher, aber müsste das nicht korrekt ausgeschrieben
zahl=zahl+1
heißen?
Member: bastla
bastla Dec 09, 2007 at 17:16:16 (UTC)
Goto Top
@maxi89
Korrekt ausgeschrieben: ja;
korrekt abgekürzt: so wie von PipeL1n3 verwendet - siehe "set /?" und dort die Zeile
    = *= /= %= += -=    - Zuordnung
(wobei zugegebener Maßen "Zuordnung" eine etwas sparsame Erklärung ist ...face-wink)
@PipeL1n3
Damit Dein Code wie vorgesehen abläuft, könntest Du es so versuchen:
@echo off & setlocal enabledelayedexpansion
set wert=0
set zahl=1
set datei=proxyliste.txt
For /F "delims=" %%i IN ('TYPE %1') DO (  
	IF %zahl%==10 set wert=1
	IF %zahl%==100 set wert=2
	IF %zahl%==1000 set wert=3
	IF !wert!==0 echo 00%zahl%=%%i>>%datei%
	IF !wert!==1 echo 0%zahl%=%%i>>%datei%
	IF !wert!==2 echo %zahl%=%%i>>%datei%
	set /A zahl+=1
	echo !zahl!
	Pause >nul
)
%datei%
Das "exit" habe ich entfernt, da Du es ziemlich sicher nicht benötigst, und es sehr lästig ist, wenn sich beim Testen dadurch immer das CMD-Fenster schließt.

Zum Thema "(enable)delayedexpansion":

In einer "for"-Schleife werden grundsätzlich alle Variablenwerte nur zu Beginn (vor dem ersten Durchlauf) ermittelt und gelten dann für alle Durchläufe. Ändert sich der Wert einer Variablen (auch, weil diese etwa überhaupt erst in der Schleife eine Wertzuweisung erhält), so "bekommt es der Interpreter nicht mit". Um ihm auf die Sprünge zu helfen, muss er zur "verzögerten Auflösung" der Variablen veranlasst werden - dann werden Änderungen der Variablenwerte auch innerhalb der Schleife berücksichtigt.

Der Preis dafür: Damit die "verzögert aufzulösenden" Variablen auch erkannt werden, gilt für diese anstelle des "%" das "!" als Variablenbegrenzung mit dem unschönen Nebeneffekt, dass das "!" in diesem Batch als "gewöhnliches" Zeichen nicht mehr verwendet werden kann und zB in einer Ausgabe nicht aufscheint (schlimmer ist es, wenn zwei "!" innerhalb eines Ausgabetextes enthalten sind - dann entfallen beide samt dem dazwischen liegenden Textteil).

Dieses Problem kann man/frau durch einen "call" aus der Schleife auf ein Unterprogramm umgehen - etwa so:
@echo off & setlocal
set wert=0
set zahl=1
set datei=proxyliste.txt
For /F "delims=" %%i IN ('TYPE %1') DO call :ProcessLine "%%i"  
%datei%
goto :eof

:ProcessLine
IF %zahl%==10 set wert=1
IF %zahl%==100 set wert=2
IF %zahl%==1000 set wert=3
IF %wert%==0 echo 00%zahl%=%~1>>%datei%
IF %wert%==1 echo 0%zahl%=%~1>>%datei%
IF %wert%==2 echo %zahl%=%~1>>%datei%
set /A zahl+=1
echo %zahl%
Pause >nul
Der dem Unterprogramm übergebene Parameter ("%%i") ist dort %1 (oder: %~1 - damit werden die umgebenden Anführungszeichen entfernt).

Mit dem "goto :eof" wird das Hauptprogramm beendet, damit nicht (unbeabsichtigt) nochmals das Unterprogramm ausgeführt wird.

Grüße
bastla

P.S.: Was hast Du mit diesem Batch eigentlich vor?

[Edit] Wie von PipeL1n3 unten dargestellt, muss natürlich auch die Variable %zahl% in der "delayedexpansion"-Version richtig als !zahl! geschrieben werden, da sie ja innerhalb der Schleife hochgezählt (und mit dem neuen Wert verwendet) werden soll. [/Edit]
Member: PipeL1n3
PipeL1n3 Dec 09, 2007 at 20:53:20 (UTC)
Goto Top
Danke für eure Antworten.
So wie ich es verwende muss es aber wenn so heißen:
@echo off & setlocal enabledelayedexpansion
set wert=0
set zahl=1
set datei=proxyliste.txt
For /F "delims=" %%i IN ('TYPE %1') DO (  
	IF !zahl!==10 set wert=1
	IF !zahl!==100 set wert=2
	IF !zahl!==1000 set wert=3
	IF !wert!==0 echo 00!zahl!=%%i>>%datei%
	IF !wert!==1 echo 0!zahl!=%%i>>%datei%
	IF !wert!==2 echo !zahl!=%%i>>%datei%
	set /A zahl+=1
)
%datei%

Benutzt wird das script um Ips für ein anderes script zu formatieren (speziell eine id zuzuordnen so man es per find in einer .txt finden kann)
Das sieht dann z.b. so aus:
001=129.69.210.97:3128
002=130.149.49.26:3124
003=130.149.49.26:3127
004=130.149.49.26:3128
005=130.75.87.83:3124
006=130.75.87.84:3124
007=131.188.44.100:3128
008=131.188.44.100:3127
009=131.246.191.42:3124
010=132.252.152.194:3124
011=141.24.249.129:3124
012=141.24.249.129:3127
013=141.24.249.130:3127
014=141.24.33.161:3124
015=141.24.33.161:3127
016=141.76.45.17:3128
017=141.76.45.17:3127
018=141.76.45.18:3127
019=193.174.67.186:3127
020=193.174.67.187:3128
021=193.174.67.187:3124
022=193.174.67.187:3127
023=193.196.39.10:3124
024=193.196.39.9:3124
025=195.37.16.101:3128
026=195.37.16.101:3127
027=195.37.16.101:3124
028=195.37.16.97:3124
029=217.172.56.130:23
030=217.172.56.174:23
031=80.237.140.233:8008
....

Aber nochne kurze frage:
Ich bin heute mittag auf der suche nach einer Antwort auf eine Seite gestossen dort waren mehrere "parameter" für den platzhalter %1 angegeben. Unter anderem auch eine, die sich zum Pfad der %1-datei expandiert. Nur leider finde ich die Seite nicht mehr .. Ideen ?! face-smile
Member: bastla
bastla Dec 09, 2007 at 21:34:55 (UTC)
Goto Top
Hallo PipeL1n3!

Zum "Formatieren auf 3 Stellen mit führenden Nullen" würde auch reichen:
@echo off & setlocal enabledelayedexpansion
set zahl=1000
set datei=proxyliste.txt
For /F "delims=" %%i IN ('TYPE %1') DO set /a zahl+=1 & echo !zahl:~-3!=%%i>>%datei%  
%datei%
Details zur Schreibweise "!zahl:~-3!" (bzw "%zahl:~-3%") findest Du in der Hilfe zu "set" (set /?).
... "parameter" für den platzhalter %1 ... zum Pfad der %1-datei expandiert
Je nachdem, wie Du "Pfad" verstanden wissen willst: %~p1 oder %~dp1 oder %~f1 (siehe Hilfe zu "for")

Grüße
bastla
Member: PipeL1n3
PipeL1n3 Dec 09, 2007 at 21:46:33 (UTC)
Goto Top
%~dp1 war das was ich brauchte face-smile

Danke vielmals