Probleme mit zählervariable
Leider habe ich mit folgendem Script ein komisches Problem:
Hier das Script:
Trotz dem set /A zahl+=1 erhöht sich der Wert der Variablen nicht!
Bitte helft mir
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
Bitte helft mir
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 75570
Url: https://administrator.de/forum/probleme-mit-zaehlervariable-75570.html
Ausgedruckt am: 09.04.2025 um 04:04 Uhr
5 Kommentare
Neuester Kommentar
@maxi89
Korrekt ausgeschrieben: ja;
korrekt abgekürzt: so wie von PipeL1n3 verwendet - siehe "set /?" und dort die Zeile
(wobei zugegebener Maßen "Zuordnung" eine etwas sparsame Erklärung ist ...
)
@PipeL1n3
Damit Dein Code wie vorgesehen abläuft, könntest Du es so versuchen:
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:
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]
Korrekt ausgeschrieben: ja;
korrekt abgekürzt: so wie von PipeL1n3 verwendet - siehe "set /?" und dort die Zeile
= *= /= %= += -= - Zuordnung
@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%
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
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]
Hallo PipeL1n3!
Zum "Formatieren auf 3 Stellen mit führenden Nullen" würde auch reichen:
Details zur Schreibweise "!zahl:~-3!" (bzw "%zahl:~-3%") findest Du in der Hilfe zu "set" (set /?).
Grüße
bastla
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%
... "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