Mit Batch in n Zeile schreiben
Hallo,
ich möchte gern in eine Bestimte Zeile in einer *.txt Datei schreiben. Könnt ihr mir weiter helfen?
Ich bin so weit gekommen das er mir die bestimmten Zeilen in den geschrieben werden sollen aus giebt.
FOR /F "delims=:" %%A IN ('findstr /N .* "1000.txt"') DO set Zeilen=%%A
echo es sind %Zeilen% Zeilen
set /a zehn=%Zeilen%/10
echo 10%% = %zehn%
set /a zwanzig=%zehn%*2
echo 20%% = %zwanzig%
set /a dreissig=%zehn%*3
echo 30%% = %dreissig%
set /a vierzig=%zehn%*4
echo 40%% = %vierzig%
set /a fuenfzig=%Zeilen%/2
echo 50%% = %fuenfzig%
set /a sechzig=%zehn%*6
echo 60%% = %sechzig%
set /a achzig=%zehn%*8
echo 80%% = %achzig%
set /a neunzig=%zehn%*9
echo 90%% = %neunzig%
echo 100%% = %Zeilen%
pause
goto :eof
Wie bekomme ich es hin das er mir die zB. 40% in die n-Zeile schreibt?
ich möchte gern in eine Bestimte Zeile in einer *.txt Datei schreiben. Könnt ihr mir weiter helfen?
Ich bin so weit gekommen das er mir die bestimmten Zeilen in den geschrieben werden sollen aus giebt.
FOR /F "delims=:" %%A IN ('findstr /N .* "1000.txt"') DO set Zeilen=%%A
echo es sind %Zeilen% Zeilen
set /a zehn=%Zeilen%/10
echo 10%% = %zehn%
set /a zwanzig=%zehn%*2
echo 20%% = %zwanzig%
set /a dreissig=%zehn%*3
echo 30%% = %dreissig%
set /a vierzig=%zehn%*4
echo 40%% = %vierzig%
set /a fuenfzig=%Zeilen%/2
echo 50%% = %fuenfzig%
set /a sechzig=%zehn%*6
echo 60%% = %sechzig%
set /a achzig=%zehn%*8
echo 80%% = %achzig%
set /a neunzig=%zehn%*9
echo 90%% = %neunzig%
echo 100%% = %Zeilen%
pause
goto :eof
Wie bekomme ich es hin das er mir die zB. 40% in die n-Zeile schreibt?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 194030
Url: https://administrator.de/forum/mit-batch-in-n-zeile-schreiben-194030.html
Ausgedruckt am: 15.05.2025 um 19:05 Uhr
17 Kommentare
Neuester Kommentar
Hallo Klettte64!
Unabhängig davon, was Du eigentlich vorhast (denn davon wissen wir ja nix, wie auch nicht über den Inhalt der bereits vorhandenen Zeilen in der Textdatei) könntest Du mit dem folgenden Batch den Inhalt einer Variablen %Zeile% in die in der Variablen %ZeilenNr% festgelegte Zeile der bestehenden Textdatei "1000.txt" schreiben und deren übrige Zeilen unverändert (außer, diese würden mit ":" beginnen) übernehmen:
Grüße
bastla
Unabhängig davon, was Du eigentlich vorhast (denn davon wissen wir ja nix, wie auch nicht über den Inhalt der bereits vorhandenen Zeilen in der Textdatei) könntest Du mit dem folgenden Batch den Inhalt einer Variablen %Zeile% in die in der Variablen %ZeilenNr% festgelegte Zeile der bestehenden Textdatei "1000.txt" schreiben und deren übrige Zeilen unverändert (außer, diese würden mit ":" beginnen) übernehmen:
@echo off & setlocal
set "Ordner=D:\Dein Ordner"
set "Datei=1000.txt"
set /a ZeilenNr=15
set "ZeileNeu=Neue Zeile"
move "%Ordner%\%Datei%" "%temp%\%Datei%"
(for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%temp%\%Datei%"') do (
if %%i neq %ZeilenNr% (echo(%%j) else (echo %ZeileNeu%)
))>"%Ordner%\%Datei%"
bastla
Hallo Klette84!
Naja, "in Zeile n schreiben" ist für mich etwas anderes als "in Zeile n eine Zeile einfügen" - das würde ich für Deine (jetzt klare) konkrete Situation eher so machen:
Die Schreibweise der Zeilen 14 bis 16 ist nur eine Vorsichtsmaßnahme, um die Originalzeilen exakt gleich (trotz ev Sonderzeichen, ":" am Anfang) in die (neue) Datei schreiben zu können.
Wenn die Zerlegung anhand des ":" problemlos funktioniert, kann das noch vereinfacht werden auf zB (ungetestet)
Grüße
bastla
Naja, "in Zeile n schreiben" ist für mich etwas anderes als "in Zeile n eine Zeile einfügen" - das würde ich für Deine (jetzt klare) konkrete Situation eher so machen:
@echo off & setlocal
set "Ordner=D:\Dein Ordner"
set "Datei=1000.txt"
move "%Ordner%\%Datei%" "%temp%\%Datei%"
for /f %%i in ('find /c /v "$$$$"^<"%temp%\%Datei%"') do set /a ZeilenGesamt=%%i
set /a Zehntel=ZeilenGesamt/10
set /a Stufe=1
set /a Z=Zehntel
for /f "delims=" %%i in ('findstr /n "^" "%temp%\%Datei%"') do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
setlocal enabledelayedexpansion
>>"%Ordner%\%Datei%" echo(!Zeile:*:=!
endlocal
set /a Z-=1
if %Z%==0 (
if %Stufe% lss 10 >>"%Ordner%\%Datei%" echo echo Programm bei %Stufe%0 %%
set /a Z=Zehntel
set /a Stufe+=1
)
goto :eof
Wenn die Zerlegung anhand des ":" problemlos funktioniert, kann das noch vereinfacht werden auf zB (ungetestet)
@echo off & setlocal
set "Ordner=D:\Dein Ordner"
set "Datei=1000.txt"
move "%Ordner%\%Datei%" "%temp%\%Datei%"
for /f %%i in ('find /c /v "$$$$"^<"%temp%\%Datei%"') do set /a ZeilenGesamt=%%i
set /a Zehntel=ZeilenGesamt/10
set /a Stufe=1
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%temp%\%Datei%"') do call :ProcessLine %%i "%%j"
goto :eof
:ProcessLine
>>"%Ordner%\%Datei%" echo(%2
set /a Mod=%1 %% Zehntel
if %Mod%==0 (
if %Stufe% lss 10 >>"%Ordner%\%Datei%" echo echo %Stufe%0 %%
set /a Stufe+=1
)
goto :eof
bastla
Hallo Klette84!
lauten soll - und dann braucht es beide "
Zum Ablauf (der Version 1):
Grüße
bastla
in Zeile 19 bzw 16 ist ein echo zu viel
Ich war davon ausgegangen, dass die Zeile in der Datei etwaecho Programm bei 40 %
echo
" ...Zum Ablauf (der Version 1):
- Die ersten Zeilen dürften selbsterklärend sein ...
- In Zeile 5 wird die Datei in den %temp%-Ordner verschoben, damit sie am Original-Speicherort wieder erstellt werden kann.
- Zeile 6 ermittelt die Gesamtzeilenanzahl (etwas schneller) mit einer alternativen Methode (hier kannst Du auch Deine ursprüngliche Variante verwenden) - da alle Zeilen gezählt werden sollen, wird ein Begriff, den es in der Datei nicht gibt, als "negatives" Suchkriterium (= finde alle Zeilen außer jenen, die diesen Suchbegriff enthalten) verwendet; als Ergebnis liefert "
find
" dann nur die Zeilenanzahl (womit das Durchlaufen aller Zeilen in der Schleife eingespart wird). - Zeile 7 ist klar (wobei anzumerken ist, dass das Ergebnis einer Division in Batch immer eine abgerundete ganze Zahl ist).
- In Zeile 8 wird der Zähler für die Zehn-Prozent-Stufen vorbelegt und in Zeile 9 die Zeilenanzahl, die einem Zehntel der Datei entspricht (nach der also dann jeweils die Ausgabe erfolgen soll).
- Die Schleife in Zeile 10 liest alle Zeilen der Datei aus (indem als Suchbegriff der "Zeilenanfang" - den hat tatsächlich jede Zeile - verwendet wird), packt die Zeile in eine Variable und ruft für jede Zeile das Unterprogramm ":ProcessLine" auf. Der "
findstr
"-Schalter "/n
}" wird übrigens hier nicht für die Zeilennummer benötigt, sondern verhindert, dass Leerzeilen einfach übersprungen würden. - Das Hauptprogramm endet in Zeile 11 (ansonsten würde das Unterprogramm am Ende nochmals durchlaufen).
- Im Unterprogramm wird zunächst der Teil der Zeile nach dem ersten ":" ausgegeben - dazu wird alles bis zum ersten ":" durch "Nichts" ersetzt (siehe dazu "
set /?
)". Die Einbettung in einen "delayedExpansion
"-Bereich beugt dabei Problemen mit ev enthaltenen Sonderzeichen vor. Die Schreibweise "echo(
" entspricht dem bekannteren "echo.
" (funktioniert aber lt jeb-the-batcher auch in bestimmten Situationen, in denen es mit "." oder "\" nicht ginge, weswegen ich dazu übergegangen bin, sie grundsätzlich zu verwenden) und sorgt dafür, dass eine Leerzeile auch "leer" (und nicht als "ECHO ist ausgeschaltet (OFF).
" ausgegeben wird. - Zeile 17 reduziert den Wert des Zeilenzählers um 1, und in Zeile 18 wird festgestellt, ob es Zeit für die Ausgabe der Information ist. Da durch die Abrundung (s. o.) die 100 % meist bereits vor der letzten Zeile erreicht werden, wird die Prozentstufe nur bist 90 % ausgegeben.
- Wenn die Ausgabe vorzunehmen war, wird der Zeilenzähler wieder auf ein Zehntel der Zeilen gesetzt und die Zehner-Prozentstufe um 1 erhöht.
- Die Zeile 23 wäre, da sie die letzte Zeile im Batch ist, nicht nötig - es schadet aber nicht, das Unterprogramm damit abzuschließen (um ggf dahinter noch weitere Zeilen, etwa für ein zweites Unterprogramm, hinzufügen zu können).
Grüße
bastla
Hallo Klatte84!
Du hast eine Mischung von "
Grüße
bastla
Du hast eine Mischung von "
for
" und "for /f
" fabriziert - letzteres liest entweder den Inhalt einer Datei zeilenweise aus oder verarbeitet das Ergebnis eines Befehls (hier wäre "dir /b
" gefragt) - daher eher:for /f "delims=" %%i in ('dir /b "%Ordner%*.mpf"') do (set "Datei=%%i" & call :Label)
bastla
Hallo Klette84!
Schön, dass es jetzt passt ...
Magst Du vielleicht noch abschließend die Möglichkeit der "Code"-Formatierung nutzen? Sieht nicht nur schöner aus, sondern ist auch besser zu lesen ...
Grüße
bastla
Schön, dass es jetzt passt ...
Magst Du vielleicht noch abschließend die Möglichkeit der "Code"-Formatierung nutzen? Sieht nicht nur schöner aus, sondern ist auch besser zu lesen ...
Grüße
bastla
Hallo Klette84!
Wenn Du 2 Zeilen je Datei schreiben willst, sollte es doch genügen, die Zeile 24 auf etwas in der Art von
zu erweitern ...
Grüße
bastla
Wenn Du 2 Zeilen je Datei schreiben willst, sollte es doch genügen, die Zeile 24 auf etwas in der Art von
if %Stufe% lss 10 (
>>"%Ordner%\%Datei%" echo MSG^("Programm bei %Stufe%0 %%"^)
>>"%Ordner%\%Datei%" echo MSG^("FN 16: F-PRINT TNC:\MELDUNGEN\UHR.txt / SCREEN:"^)
)
Grüße
bastla
Hallo Klette84!
Ungetestet etwa so:
Grüße
bastla
Ungetestet etwa so:
setlocal
set /a Ignore=15
CLS
echo.
set "Ordner=%~dp0"
for /f "delims=" %%i in ('dir /b "%Ordner%*.h"') do (set "Datei=%%i" & call :Label)
echo.
echo Alle Datein bearbeitet.
echo.
PAUSE
goto :TOP
:Label
echo.
echo Bitte warten, Programm %Datei% wird aktualisiert!
move "%Ordner%%Datei%" "%temp%\%Datei%"
for /f %%i in ('find /c /v "$$$$"^<"%temp%\%Datei%"') do set /a ZeilenGesamt=%%i-%Ignore%
set /a Zehntel=ZeilenGesamt/10
set /a Stufe=1
set /a Z=Zehntel
set /a ZNr=1
for /f "delims=" %%i in ('findstr /n "^" "%temp%\%Datei%"') do set "Zeile=%%i" & call :ProcessLine
goto :eof
:ProcessLine
setlocal enabledelayedexpansion
>>"%Ordner%%Datei%" echo(!Zeile:*:=!
endlocal
set /a ZNr+=1
if %ZNr% leq %Ignore% goto :eof
set /a Z-=1
if %Z%==0 (
>>"%Ordner%%Datei%" echo Q1999 = %Stufe%0
>>"%Ordner%%Datei%" echo FN 16: F-PRINT TNC:\MELDUNGEN\UHR.txt / SCREEN:
set /a Z=Zehntel
set /a Stufe+=1
)
goto :eof
bastla