Dos batchjob zeilen und zeichen aus datei extrahieren
hallo leute, ich hab ein dringendes problem und leider nicht die nötige zeit mich in die dosshell einzuarbeiten. die lösung muss irgendwie heute auf den tisch.
ich habe gestern schon angefangen die anforderung umzusetzen, stecke aber fest was vermutlich an meinem mangelndem knowhow in sachen dos liegt.
es wäre nett wenn ihr mir helfen könntet.
Ich defiere erst einmal die anforderung und post danach das was ich bereits gebaut habe.
-- Anforderung--
C.\script.bat <N>
Kopiere die Zeilen in eine weitere Datei. Bei erneuten Ausführen des Scripts soll diese Datei überschrieben werden.
Definiere zwei Variablen.
Var1 = die ersten 12 Zeichen der ersten Zeile aus Datei 2
Var2 = die ersten 12 Zeichen der letzten Zeile aus Datei 2
gebe Var1+Var2 auf der Konsole aus
-- Anforderung Ende --
Hier nun mein bisheriges Bastelwerk
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a Anzahl=12
set "Delim="
if exist "%Aus%" del "%Aus%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do set "Zeile=%%j" & call :ProcessFile %%i
goto :eof
:ProcessFile
set /a KeinUmbruch=%1 %% Anzahl
if %KeinUmbruch% gtr 0 (
) else (
)
goto :eof
Leider tut es nicht was es soll, da es mir alle Zeilen der Datei ausgibt und nicht die angegebenen 12
Bitte nur konstruktive Beiträge und keine Antworten wie: Nehm doch VB oder PS. Beides ist aus Sicherheitsgründen auf dem Zielsystem nicht erlaubt.
Das mit dem Umbruch ist nur zu Testzwecken eingebaut und soll nachher nicht mehr sein. Die extrahierten Zeilen sollen also umgebrochen werden.
Thanks in advance ;)
ich habe gestern schon angefangen die anforderung umzusetzen, stecke aber fest was vermutlich an meinem mangelndem knowhow in sachen dos liegt.
es wäre nett wenn ihr mir helfen könntet.
Ich defiere erst einmal die anforderung und post danach das was ich bereits gebaut habe.
-- Anforderung--
C.\script.bat <N>
- der <N>ist eine zahl.
Kopiere die Zeilen in eine weitere Datei. Bei erneuten Ausführen des Scripts soll diese Datei überschrieben werden.
Definiere zwei Variablen.
Var1 = die ersten 12 Zeichen der ersten Zeile aus Datei 2
Var2 = die ersten 12 Zeichen der letzten Zeile aus Datei 2
gebe Var1+Var2 auf der Konsole aus
-- Anforderung Ende --
Hier nun mein bisheriges Bastelwerk
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a Anzahl=12
set "Delim="
if exist "%Aus%" del "%Aus%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do set "Zeile=%%j" & call :ProcessFile %%i
goto :eof
:ProcessFile
set /a KeinUmbruch=%1 %% Anzahl
if %KeinUmbruch% gtr 0 (
"%Aus%" echo %Zeile%
"%Aus%" echo %Zeile%
"%Aus%" echo\
"%Aus%" echo\
goto :eof
Leider tut es nicht was es soll, da es mir alle Zeilen der Datei ausgibt und nicht die angegebenen 12
Bitte nur konstruktive Beiträge und keine Antworten wie: Nehm doch VB oder PS. Beides ist aus Sicherheitsgründen auf dem Zielsystem nicht erlaubt.
Das mit dem Umbruch ist nur zu Testzwecken eingebaut und soll nachher nicht mehr sein. Die extrahierten Zeilen sollen also umgebrochen werden.
Thanks in advance ;)
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160496
Url: https://administrator.de/contentid/160496
Ausgedruckt am: 21.11.2024 um 23:11 Uhr
22 Kommentare
Neuester Kommentar
moin,
umgebastelte Biber erkenn ich doch auf den ersten Blick auch ohne Code Tags...
Da wo du den her hast, war doch bestimmt auch etwas mehr dabei?
Du brauchst auf was ganz anderes, einmal muß im Script %1 ausgewertet werden und dieses %1 muß dann in eine For /l Schleife das eine Findstr /n Schleife und dann ein Echo herausrückt.
Sorry, aber die Zeile heute muß es auf den Tisch und ich hab keine Zeit mich in ein System einzuarbeiten, das es erst seit neunzehnundertpaarundachtzig gibt - da verliere ich die Lust
Hin und wieder kommt es vor, dass ich meinem CHef sage, das geht nicht, oder das kann ich nicht und das ist eine Charakterstärke, keine Schwäche
Kann man denn so eine Frage nicht abends stellen, wenn wir Feierabend haben und nicht dann, wenn wir selber Kohle ranschaffen müssen?
Gruß
umgebastelte Biber erkenn ich doch auf den ersten Blick auch ohne Code Tags...
Da wo du den her hast, war doch bestimmt auch etwas mehr dabei?
leider nicht die nötige zeit mich in die dosshell einzuarbeiten. die lösung muss irgendwie heute auf den tisch.
Bitte nur konstruktive Beiträge und keine Antworten wie:
Bitte nur konstruktive Beiträge und keine Antworten wie:
leider tut es nicht was es soll, da es mir alle Zeilen der Datei ausgibt und nicht die angegebenen 12
- Der einzige "Aufruf" ist doch in:
set /a Anzahl=12
Das nirgendwo weiter verwurstet ist - das Script ist ja auch für was anderes Gebastelbibert worden.- Solange da echo off als erster Befehl drin steht, wirst du auch nie herausfinden, was das Script macht.
Du brauchst auf was ganz anderes, einmal muß im Script %1 ausgewertet werden und dieses %1 muß dann in eine For /l Schleife das eine Findstr /n Schleife und dann ein Echo herausrückt.
Lese aus einer Datei <N> Zeilen oder alle Zeilen die kleienr <N> sind aus.
und wie soll das gesteuert werden, ob n zeilen oder alle Zeilen bis?Sorry, aber die Zeile heute muß es auf den Tisch und ich hab keine Zeit mich in ein System einzuarbeiten, das es erst seit neunzehnundertpaarundachtzig gibt - da verliere ich die Lust
Hin und wieder kommt es vor, dass ich meinem CHef sage, das geht nicht, oder das kann ich nicht und das ist eine Charakterstärke, keine Schwäche
Kann man denn so eine Frage nicht abends stellen, wenn wir Feierabend haben und nicht dann, wenn wir selber Kohle ranschaffen müssen?
Gruß
Aloha T-Mo,
[OT]Ja, jetzt wo du es sagst ;) - ich guck mir Codes ohne Tags schon gar nicht mehr an, weil mein Gehirn sonst auf Lesemodus statt Skriptmodus springt.
Aber ist doch schön, dass es sein bisheriges Bastelwerk ist *hust* laut seiner Aussage[/OT]
greetz André
umgebastelte Biber erkenn ich doch auf den ersten Blick auch ohne Code Tags...
[OT]Ja, jetzt wo du es sagst ;) - ich guck mir Codes ohne Tags schon gar nicht mehr an, weil mein Gehirn sonst auf Lesemodus statt Skriptmodus springt.
Aber ist doch schön, dass es sein bisheriges Bastelwerk ist *hust* laut seiner Aussage[/OT]
greetz André
Zitat von @Skyemugen:
Aloha T-Mo,
> umgebastelte Biber erkenn ich doch auf den ersten Blick auch ohne Code Tags...
[OT]Ja, jetzt wo du es sagst ;) - ich guck mir Codes ohne Tags schon gar nicht mehr an, weil mein Gehirn sonst auf Lesemodus statt
Skriptmodus springt.
Aber ist doch schön, dass es sein bisheriges Bastelwerk ist *hust* laut seiner Aussage[/OT]
Aloha T-Mo,
> umgebastelte Biber erkenn ich doch auf den ersten Blick auch ohne Code Tags...
[OT]Ja, jetzt wo du es sagst ;) - ich guck mir Codes ohne Tags schon gar nicht mehr an, weil mein Gehirn sonst auf Lesemodus statt
Skriptmodus springt.
Aber ist doch schön, dass es sein bisheriges Bastelwerk ist *hust* laut seiner Aussage[/OT]
[OT]
u.A Diese und die von mir zitierten Zeilen - auf sowas hab ich wirklich keine Lust - vielleicht kommt nachher Meister Bastla und bringt den gütigen Samariter mit, man weiß es nicht, aber was so ein paar geschriebene und ein paar ungeschriebene Zeilen so ausmachen können - das finde ich sehr interessant.
btw: Wir alle haben ja auch irgendwo das - was wir können gelernt und Fremde Federn bleiben fremde Federn
[/OT]
greetz André
retour
Moin,
das hört sich doch ganz anders an....
Demo an der Dosbox
Damit hat man .- wenn man einen Ordner Script und darin einen Ordner Demo2 hat - eine Datei zum spielen.
Angenommen man will jetzt bis Zeile x alles haben - dann....
Festverdrahtet immer noch in der Dosbux...
Es soll aber nichtfestverdrahtet sein, sondern via %1
- Ich vermute - das kriegst du dann selber hin.
"&&" ist ein Biber oder ein fpschultze?, der für Befehl erfolgreich ausgeführt steht.
Ganz ohne Echo off und nur wegen der Abfrage ob und ob nicht - ein mehrzeiler - sonst killefitz...
Zu beachten - hat die Zeile selber ein : mußt du das abfangen - auch das kriegt man ganz einfach hin.
Gruß
Zitat von @instinctless:
Hallo Timo,
du sollst mir ja nicht den code vorkauen sondern mir nur bissel helfen.
Hallo Timo,
du sollst mir ja nicht den code vorkauen sondern mir nur bissel helfen.
das hört sich doch ganz anders an....
Demo an der Dosbox
for /l %a in (1,1,9) do echo %aTest>>C:\script\demo2\demo2.txt
Angenommen man will jetzt bis Zeile x alles haben - dann....
Festverdrahtet immer noch in der Dosbux...
for /f "tokens=1,* delims=:" %a in ('findstr /n "." C:\script\demo2\demo2.txt') do if %a leq 2 echo %a %b
Es soll aber nichtfestverdrahtet sein, sondern via %1
- Ich vermute - das kriegst du dann selber hin.
"&&" ist ein Biber oder ein fpschultze?, der für Befehl erfolgreich ausgeführt steht.
if "%1"=="" echo error
echo %1 |findstr [a-z] && echo nur zahlen erlaubt
for /f "tokens=1,* delims=:" %%a in ('findstr /n "." C:\script\demo2\demo2.txt') do if %%a leq %1 echo %a %b
pause
Ganz ohne Echo off und nur wegen der Abfrage ob und ob nicht - ein mehrzeiler - sonst killefitz...
Zu beachten - hat die Zeile selber ein : mußt du das abfangen - auch das kriegt man ganz einfach hin.
Gruß
Hallo @all!
Wieder einmal völlig ungetestet (und unter der Annahme, dass es keine anderen Variablen gibt, deren Name mit "Var" beginnt):
Grüße
bastla
Wieder einmal völlig ungetestet (und unter der Annahme, dass es keine anderen Variablen gibt, deren Name mit "Var" beginnt):
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a AnzahlZeilen=2
set /a AnzahlZeichen=12
if exist "%Aus%" del "%Aus%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do if %%i leq %1 (set "Zeile=%%j" & call :ProcessFile %%i)
for /f "tokens=1* delims==" %%i in ('set Var') do echo %%j
goto :eof
:ProcessFile
>>"%Aus%" echo\%Zeile%
if %1 gtr %AnzahlZeilen% goto :eof
call set "Var%1=%%Zeile:~,%AnzahlZeichen%%%"
goto :eof
bastla
Moin
Wenns der gütige Bastla mal wieer mit einem ungetesteten echo off Schnippsel geschafft hat - dann kleb doch bitte den Wie kann ich einen Beitrag als gelöst markieren? an den Fred.
@bastla: Das rafft doch wieder keiner, was du da gezimmert hast Erst als ich dein ungetestetes Schnippselchen angesehen hab, hab ich mir nochmal die Frage genauer angeschaut
Das kommt vom schlechten Kantinenkaffee
Gruß
Wenns der gütige Bastla mal wieer mit einem ungetesteten echo off Schnippsel geschafft hat - dann kleb doch bitte den Wie kann ich einen Beitrag als gelöst markieren? an den Fred.
@bastla: Das rafft doch wieder keiner, was du da gezimmert hast Erst als ich dein ungetestetes Schnippselchen angesehen hab, hab ich mir nochmal die Frage genauer angeschaut
Das kommt vom schlechten Kantinenkaffee
Gruß
@t-mo
Auf vielfachen Wunsch eine kurze Erklärung (und ich fange gleich in Zeile 8 an):
ist ja nicht wirklich neu - es werden einfach alle Zeilen, die einen Zeilenanfang ("^") haben (und damit im Gegensatz zum Suchbegriff "." auch solche, in denen aber schon gar nix steht), nummeriert aufgelistet, wobei die Nummer von der Zeile durch einen ":" getrennt (oder auch "delimited") wird.
Da ja über den Zeileninhalt (ausnahmsweise, kommt hier im Forum ganz selten vor) nix bekannt ist, soll alles, was nach dem ersten ":" folgt, nicht weiter zerlegt werden (könnten ja noch weitere ":" enthalten sein) - deswegen nur die "tokens" 1 (=Nummer) und "*" (=der ganze Rest) erzeugen.
Es soll ja nur eine bestimmte Anzahl von Zeilen (und die wurde als Parameter %1übergeben) in die neue Datei geschrieben werden - daher der Vergleich, ob die aktuelle Zeilennummer noch kleiner / gleich (outlandish: less or equal) der gewünschten Anzahl (ja, steht in %1) ist. Wenn dem so ist, werden die Anweisungen in der folgenden Klammer ausgeführt.
Die Zeile steht im zweiten erzeugten "token" (nach %%i ist das %%j) und wird aber (später) in einer eigenen Variablen benötigt und daher %Zeile% zugewiesen. Die weitere Verarbeitung erfolgt dann im Unterprogramm :ProcessFile (das hier besser :ProcessLine heißen sollte). Beim Aufruf dieses Unterprogrammes wird die laufende Nummer als Parameter mitgenommen.
Wenn dann alles, was zu tun war, für alle Zeilen durch ist, können noch, wie gewünscht, die aus den ersten beiden Zeilen (siehe oben: %AnzahlZeilen%) gewonnen Informationen angezeigt werden - der Einfachheit halber, indem in einer weiteren Schleife die Auflistung aller Variablen, deren Name mit "Var" beginnt - diese erfolgt nach dem Schema
vorgenommen wird. Da nur die Werte, nicht aber die Variablennamen interessieren (habe ich zumindest angenommen), wird jede Zeile am ersten "=" geteilt und wieder nur der danach folgende Teil ausgegeben.
Damit ist der Job erledigt und das Hauptprogramm kann ein Ende finden:
Da war dann ja aber auch noch das Unterprogramm, das die eigentlich Arbeit erledigt (und daher natürlich als Letztes erwähnt wird ):
Zuerst einmal die Zeile in die neue Datei schreiben (der "\" - oft wird auch "." verwendet - sorgt dafür, das eine Leerzeile auch als solche in der Datei landet) - zur Erinnerung: Wir sind im Unterprogramm, weil noch nicht die vorgegebene Zeilenanzahl überschritten war und daher in der oberen Schleife der Aufruf erfolgte).
Falls die Anzahl der Zeilen, für die Variablen erzeugt werden sollten, schon überschritten ist (festzustellen durch den Vergleich der übergebenen Zeilennummer, die hier im Unterprogramm als %1 - nicht zu verwechseln mit dem %1 des Hauptprogrammes - angekommen ist, mit dem in der Variablen %AnzahlZeilen% festgelegten Wert - hier: 2), gibt's nix mehr zu tun, daher Rücksprung (das ist in diesem Fall die Bedeutung des "
Da wir immer noch hier sind, handelt es sich bei der aktuellen Zeile offensichtlich um Zeile 1 oder 2, und von denen sollen ja die ersten 12 Zeichen (bzw, so viele, wie in %AnzahlZeichen% festgelegt wurde) in Variablen festgehalten werden. Das Erzeugen des Teilstrings kann nicht unter Verwendung einer Schleifenvariablen (zB %%j) erfolgen, weshalb oben die Zeile in der gleichnamigen Variablen gespeichert wurde. Die neue Variable soll nach der Zeilennummer (steht hier in %1) %Var1% oder %Var2% (usw, wenn es mal mehr Zeilen werden sollten) benannt werden - daher: "
Um aus einer Variablen (%Zeile%) eine variable Anzahl von Zeichen (%AnzahlZeichen%) herausholen zu können, würde entweder "delayedExpansion" benötigt, oder die hier verwendete "
Damit ist's aber dann wirklich genug hier, und daher wieder zurück in das Hauptprogramm ("
Ich hoffe, dass
Grüße
bastla
Auf vielfachen Wunsch eine kurze Erklärung (und ich fange gleich in Zeile 8 an):
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do
Da ja über den Zeileninhalt (ausnahmsweise, kommt hier im Forum ganz selten vor) nix bekannt ist, soll alles, was nach dem ersten ":" folgt, nicht weiter zerlegt werden (könnten ja noch weitere ":" enthalten sein) - deswegen nur die "tokens" 1 (=Nummer) und "*" (=der ganze Rest) erzeugen.
if %%i leq %1
(set "Zeile=%%j" & call :ProcessFile %%i)
for /f "tokens=1* delims==" %%i in ('set Var') do echo %%j
Var1=Wert der Variablen Var1
Damit ist der Job erledigt und das Hauptprogramm kann ein Ende finden:
goto :eof
Da war dann ja aber auch noch das Unterprogramm, das die eigentlich Arbeit erledigt (und daher natürlich als Letztes erwähnt wird ):
>>"%Aus%" echo\%Zeile%
>if %1 gtr %AnzahlZeilen% goto :eof
goto :eof
") ins Hauptprogramm.>call set "Var%1=%%Zeile:~,%AnzahlZeichen%%%"
set Var%1=
"Um aus einer Variablen (%Zeile%) eine variable Anzahl von Zeichen (%AnzahlZeichen%) herausholen zu können, würde entweder "delayedExpansion" benötigt, oder die hier verwendete "
call
"-Methode - aufgelöst würde dabei nach dem "=" stehen: "%Zeile:~0,12%
", womit die ersten 12 Zeichen (es wird am Anfang kein einziges Zeichen übersprungen) aus %Zeile% entnommen werden.Damit ist's aber dann wirklich genug hier, und daher wieder zurück in das Hauptprogramm ("
goto :eof
" ist ja jetzt schon ein alter Hut).Ich hoffe, dass
Das rafft doch wieder keiner
jetzt nicht mehr flächendeckend zutrifft ... Grüße
bastla
Hallo instinctless!
Mit der Änderung sähe das so aus:
Es wird hier in der zusätzlichen Zeile
ohne weitere Bedingung der Variablenwert gesetzt, sodass immer (= für alle an das Unterprogramm übergebenen Zeilen) der vorhergehende Wert überschrieben wird - am Ende steht daher der letzte Wert in der "Spezial"-Variablen (nicht mit Zeilennummer versehen).
Ansonsten: Bei Fragen: fragen
Grüße
bastla
Mit der Änderung sähe das so aus:
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a AnzahlZeilen=1
set /a AnzahlZeichen=12
if exist "%Aus%" del "%Aus%"
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do if %%i leq %1 (set "Zeile=%%j" & call :ProcessFile %%i)
for /f "tokens=1* delims==" %%i in ('set Var') do echo %%j
goto :eof
:ProcessFile
>>"%Aus%" echo\%Zeile%
call set "VarLetzte=%%Zeile:~,%AnzahlZeichen%%%"
if %1 gtr %AnzahlZeilen% goto :eof
call set "Var%1=%%Zeile:~,%AnzahlZeichen%%%"
goto :eof
call set "VarLetzte=%%Zeile:~,%AnzahlZeichen%%%"
Ansonsten: Bei Fragen: fragen
Grüße
bastla
Hallo instinctless!
Wozu das gut sein soll erschließt sich einem tatsächlich nicht auf Anhieb ...
Es bleibt aber trotzdem noch die Frage offen, was am Ende in der Datei stehen soll, wenn die Zeilenanzahl nicht restlos durch N teilbar ist?
Ich würde übrigens das zwischenzeitliche Schreiben in die Datei vermeiden und nur die entsprechenden Teilzeilen (also für zB N=10 nur die ersten 12 Zeichen der Zeilen 1, 10, 11, 20, etc) ausgeben und dann eben abschließend zB die Zeilen 141 bis 148 in die "DatenNeu.txt" schreiben ...
Grüße
bastla
Wozu das gut sein soll erschließt sich einem tatsächlich nicht auf Anhieb ...
Es bleibt aber trotzdem noch die Frage offen, was am Ende in der Datei stehen soll, wenn die Zeilenanzahl nicht restlos durch N teilbar ist?
Ich würde übrigens das zwischenzeitliche Schreiben in die Datei vermeiden und nur die entsprechenden Teilzeilen (also für zB N=10 nur die ersten 12 Zeichen der Zeilen 1, 10, 11, 20, etc) ausgeben und dann eben abschließend zB die Zeilen 141 bis 148 in die "DatenNeu.txt" schreiben ...
Grüße
bastla
Hallo instinctless!
Warum sollte eine "err msg" kommen? Es wird doch nur für die vorhandenen Zeilen geprüft, ob sie noch in das "Kontingent" fallen und daher zu schreiben sind - daher: Keine Zeilen mehr - keine Prüfung mehr (und die "endgültige" Datei umfasst dann eben soviele Zeilen, wie noch über waren) ...
"
Tatsächlich frage ich mich inzwischen allerdings, ob ich mich an einem Unsinn wie "Schreiben wir im Abstand von Sekunden(bruchteilen) neue Zeilen in immer die selbe Datei, auch wenn nix und niemand die dadurch überschriebenen Inhalte nachvollzieht (nachvollziehen kann)." überhaupt noch beteiligen mag ...
Grüße
bastla
Warum sollte eine "err msg" kommen? Es wird doch nur für die vorhandenen Zeilen geprüft, ob sie noch in das "Kontingent" fallen und daher zu schreiben sind - daher: Keine Zeilen mehr - keine Prüfung mehr (und die "endgültige" Datei umfasst dann eben soviele Zeilen, wie noch über waren) ...
"
echo on
" hat übrigens keinen Einfluss auf die Ausgabe von Fehlermeldungen, sondern legt nur fest, dass die Befehlszeile vor der Ausführung noch angezeigt wird (wobei die Variablen bereits durch ihren Inhalt ersetzt sind und damit der Ablauf besser nachvollziehbar wird, wenn es gerade mal nicht so tut wie soll).Tatsächlich frage ich mich inzwischen allerdings, ob ich mich an einem Unsinn wie "Schreiben wir im Abstand von Sekunden(bruchteilen) neue Zeilen in immer die selbe Datei, auch wenn nix und niemand die dadurch überschriebenen Inhalte nachvollzieht (nachvollziehen kann)." überhaupt noch beteiligen mag ...
Grüße
bastla
Naja, what shall's:
Furchtbar, so verspielt zu sein ...
Grüße
bastla
[Edit] Zeilen 10 bis 13 zur Ausgabe der ersten und letzten Zeile des letzten Blocks noch ergänzt. [/Edit]
[Edit2] In den Zeilen 12 und 25 %Zeile% durch %Letzte% ersetzt. [/Edit2]
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a AnzahlZeichen=12
set "N=%~1"
if not defined N echo Keine Zeilenanzahl angegeben! & pause & goto :eof
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do (set "Zeile=%%j" & call :ProcessFile %%i)
If %Nr% neq 0 (
echo %Erste%
echo %Letzte%
)
goto :eof
:ProcessFile
set /a Nr=%1 %% N
if %Nr%==1 (
del "%Aus%" 2>nul
call set "Erste=%%Zeile:~,%AnzahlZeichen%%%"
)
call set "Letzte=%%Zeile:~,%AnzahlZeichen%%%"
if %Nr%==0 (
echo %Erste%
echo %Letzte%
echo\
)
>>"%Aus%" echo\%Zeile%
goto :eof
Grüße
bastla
[Edit] Zeilen 10 bis 13 zur Ausgabe der ersten und letzten Zeile des letzten Blocks noch ergänzt. [/Edit]
[Edit2] In den Zeilen 12 und 25 %Zeile% durch %Letzte% ersetzt. [/Edit2]
Hallo instinctless!
Geht es denn so (mit nur einmaligem Schreiben) besser?
Grüße
bastla
ich habe echo %Zeile% durch %Letzte% ersetzt und nun gibt er auch die 12 Zeichen aus
Richtige Korrektur (habe ich inzwischen oben auch durchgeführt)in einigen zeilen steht nämlich 'Zugriff verweigert' o0
wie kommt denn sowas zustande? in der einzulesenden textdatei stehen nur zahlen.
Sorry - kann ich nicht nachvollziehen (ich teste allerdings mit nur wenigen Zeilen auf einem schnellen Speicher) ...wie kommt denn sowas zustande? in der einzulesenden textdatei stehen nur zahlen.
Geht es denn so (mit nur einmaligem Schreiben) besser?
@echo off & setlocal
set "Ein=D:\scripts\liste.txt"
set "Aus=D:\scripts\DatenNeu.txt"
set /a AnzahlZeichen=12
set "N=%~1"
if not defined N echo Keine Zeilenanzahl angegeben! & pause & goto :eof
set /a N=N
if %N% leq 1 echo Keine sinnvolle Zeilenanzahl angegeben! & pause & goto :eof
del "%Aus%" 2>nul
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Ein%"') do (set "Zeile=%%j" & call :ProcessFile %%i)
If %Nr% neq 0 (
echo %Erste%
echo %Letzte%
)
more +%ToSkip% "%Ein%">"%Aus%"
goto :eof
:ProcessFile
set /a Nr=%1 %% N
if %Nr%==1 (
call set "Erste=%%Zeile:~,%AnzahlZeichen%%%"
set /a ToSkip=%1-1
)
call set "Letzte=%%Zeile:~,%AnzahlZeichen%%%"
if %Nr%==0 (
echo %Erste%
echo %Letzte%
echo\
)
goto :eof
bastla