vvss
Goto Top

Gleiche Zeilen in einer Textdatei zusammenfassen

Hallo Zusammen,


Weiß leider nicht wie ich das ohne Hilfe machen soll?

Und zwar habe ich eine Texdatei die wie folgt aufgebaut ist:


AA_Beispieltext von AA1-1
BB_Beispieltext von BB1-1
CC_Beispieltext von CC1-1
DD_Beispieltext von DD1-1
DD_Beispieltext von DD1-2
DD_Beispieltext von DD1-3
EE_Beispieltext von EE1-1
FF_Beispieltext von FF1-1
AA_Beispieltext von AA2-1
BB_Beispieltext von BB2-1
CC_Beispieltext von CC2-1
DD_Beispieltext von DD2-1
DD_Beispieltext von DD2-2
EE_Beispieltext von EE2-1
FF_Beispieltext von FF2-1

Mein Problem liegt nun darin, zwischen den Zeilen AA1-1 und AA2-1 sollen die DD-Zeilen in einer einzigen DD-Zeile hintereinander geschrieben werden.
Die neue Zeile (DD_Beispieltext von DD1-1Beispieltext von DD1-2Beispieltext von DD1-3) soll nun auch noch unter die Zeile AA1-1 geschoben werden,und auch noch gefolgt von Zeile EE-1-1.


Die neue Textdatei sollte wie dann wie folgt aussehen:

AA
DD (1 bis xxx in einer Zeile)
EE
CC
FF
AA
DD
usw.


Danke für Eure Hilfe !!!!!

Content-Key: 172680

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

Ausgedruckt am: 28.03.2024 um 21:03 Uhr

Mitglied: rubberman
rubberman 06.09.2011 um 19:07:36 Uhr
Goto Top
Hallo -vvss-.

Das Ganze ist ziemlich abstrakt für mein Verständnis. Wie würde so etwas denn real aussehen?
Hast du es mit einer Art HTML oder XML Text zu tun?
Gibt es Zeileneinzüge (kann man bei dir nicht sehen, weil du deinen Beispielinhalt nicht in Code-Tags eingeschlossen hast)?
Gibt es feste Breiten?
Ist immer die selbe Anzahl an Leerzeichen in einer Zeile?
Gibt es Zeichen, an denen die Zeile aufgesplittet werden könnte?
...

Grüße
rubberman
Mitglied: Friemler
Friemler 06.09.2011 um 19:14:36 Uhr
Goto Top
Hallo -vvss-,

teste mal folgendes:
@echo off & setlocal


::Diese beiden Variablen anpassen
set "InFile=.\test.txt"  
set "OutFile=.\test2.txt"  


::Interne Variablen initialisieren
set "BufferFile=%Temp%\Buffer.txt"  
set "DDLineBuffer=%Temp%\DDBuffer.txt"  

::Evtl. existierende Dateien löschen
del "%OutFile%" 2>NUL  
del "%BufferFile%" 2>NUL  
del "%DDLineBuffer%" 2>NUL  

::Aus der Eingabedatei alle Zeilen einlesen
for /f "tokens=1* delims=_" %%a in ('findstr "^" "%InFile%"') do (  
  set "Prefix=%%a"  

  rem Unterprogramm ProcessLine aufrufen
  rem und dessen Ausgaben in die Ausgabedatei schreiben
  >>"%OutFile%" call :ProcessLine  
)

::Evtl. existierende Bufferdatei für DD-Zeile an die Ausgabedatei anhängen
::Notwendig falls die letzte Zeile in der Eingabedatei mit DD beginnt
if exist "%DDLineBuffer%" >>"%OutFile%" (type "%DDLineBuffer%" & echo.)  

::Evtl. existierende Bufferdatei an die Ausgabedatei anhängen
::Notwendig um den letzten Block der Eingabedatei vollständig zu schreiben
if exist "%BufferFile%" >>"%OutFile%" type "%BufferFile%"  

::Bufferdateien löschen
del "%BufferFile%" 2>NUL  
del "%DDLineBuffer%" 2>NUL  

::Scriptende
exit /b



::Unterprogramm
:ProcessLine
  ::Ist es eine Zeile, die mit AA beginnt?
  if "%Prefix%" equ "AA" (  
    rem Existiert die Bufferdatei schon?
    if exist "%BufferFile%" (  
      rem Ja: Bufferdatei ausgeben und danach löschen
      type "%BufferFile%"  
      del "%BufferFile%"  
    )

    rem Die aktuelle Zeile ausgeben,
    rem und Rücksprung ins Hauptprogramm
    for /l %%x in (1,1,1) do echo %%a_%%b
    exit /b
  )

  ::Ist es eine Zeile, die mit DD beginnt?
  if "%Prefix%" equ "DD" (  
    rem Wurde gerade die erste dieser Zeilen eingelesen?
    if not exist "%DDLineBuffer%" (  
      rem Ja: Zeileninhalt MIT Prefix und "_" in Bufferdatei für DD-Zeile schreiben (ohne Zeilenumbruch)  
      for /l %%x in (1,1,1) do > "%DDLineBuffer%" <NUL set /p "=%%a_%%b "  
    ) else (
      rem Nein: Zeileninhalt OHNE Prefix und "_" an Bufferdatei für DD-Zeile anhängen (ohne Zeilenumbruch)  
      for /l %%x in (1,1,1) do >>"%DDLineBuffer%" <NUL set /p "=%%b "  
    )

    rem Rücksprung ins Hauptprogramm
    exit /b
  )

  ::Wenn die Zeile, die mit EE beginnt, eingelesen wurde,
  ::den Inhalt der Bufferdatei für die DD-Zeile plus Zeilenumbruch ausgeben,
  ::Bufferdatei für die DD-Zeile löschen,
  ::die aktuelle Zeile ausgeben,
  ::Rücksprung ins Hauptprogramm.
  if "%Prefix%" equ "EE" (  
    type "%DDLineBuffer%" & echo.  
    del "%DDLineBuffer%"  
    for /l %%x in (1,1,1) do echo %%a_%%b
    exit /b
  )

  ::Zeilen, die durch die obigen Blöcke nicht verarbeitet wurden,
  ::in eine Bufferdatei schreiben
  for /l %%x in (1,1,1) do (
    rem Enthält die Zeile nach dem Prefix noch weitere Zeichen?
    if "%%c" neq "" (  
      rem Ja: Alles ausgeben
      >>"%BufferFile%" echo %%a_%%b  
    ) else (
      rem Nein: Nur das Prefix oder, wenn die Zeile auch kein
      rem       Prefix enthält, eine Leerzeile ausgeben
      >>"%BufferFile%" echo\%%a  
    )
  )

::Rücksprung ins Hauptprogramm
exit /b

Ansonsten kann ich rubberman nur beipflichten, sehr abstrakt.

[EDIT]
Script geändert:
  • Die Zerlegung der Eingabedatei wird anhand der ersten x Zeichen jeder Zeile (die Prefixes, hier AA, BB, usw., nach denen ein _ kommen muss) durchgeführt.
  • Sonderzeichen in den Texten sind kein Problem, in den Prefixes schon.
  • Leere Zeilen werden übernommen.

Schönheitsfehler:
  • Die Zeile, in der die mehrfachen DD-Zeilen zusammengefasst sind, enthält als letztes Zeichen ein Leerzeichen.
[/EDIT]

Gruß
Friemler
Mitglied: pieh-ejdsch
pieh-ejdsch 07.09.2011 um 10:42:07 Uhr
Goto Top
moin vvss,

falls Frimlers Script nicht tat gib mal Antwort (bzw. überhaupt mal ein Lebenszeichen).

hier ist nochwas Falls nur am Ende die Ziffern mit Strich sind.
Die Datei Draufziehen
@echo off&setlocal
:: Bitte zuerst mit Testdaten Probieren
if not exist "%~1" goto :eof  
findstr /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test"  
for /f "usebackq delims=" %%i in ("%~dpn1.test") do (set "Line=%%i"  
	setlocal enabledelayedexpansion
	for /f "delims=" %%j in ("!NewLine!!Line!") do endlocal & set "NewLine=%%j"  
)
findstr /v /r /c:"^DD_.*1-[0-9]*$" "%~1">"%~dpn1.test"  
findstr /r /c:"^AA_.*1-[0-9]*$" "%~dpn1.test" > "%~1"  
setlocal enabledelayedexpansion
>>"%~1" echo !NewLine!  
endlocal
findstr /r /c:"^EE_.*1-[0-9]*$" "%~dpn1.test" >> "%~1"  
findstr /v /r /c:"^[ADE][ADE]_.*1-[0-9]*$" "%~dpn1.test" >> "%~1"  
del  "%~dpn1.test"  

Gruß Phil
Mitglied: Lochkartenstanzer
Lochkartenstanzer 07.09.2011 um 12:41:41 Uhr
Goto Top
Zitat von @vvss:
Die neue Textdatei sollte wie dann wie folgt aussehen:

AA

Was ist mit BB und CC passiert? Sollen die nicht mit rein?

DD (1 bis xxx in einer Zeile)
EE
CC

Oder doch? Nur ein bischen?


FF
AA
DD
usw.


Danke für Eure Hilfe !!!!!

Irgendwie hast Du das Problem imho nicht genau genug beschrieben.

Ich hätte aufgrund Deiner Beschreibung einfach folgendes gemacht (in bash):
cat textdatei.txt  | gawk -F "_"  { print $1 } ' | uniq >ergebnisdatei.txt
Mitglied: vvss
vvss 08.09.2011 um 08:54:08 Uhr
Goto Top
Hallo Zusammen,

erstmal vielen Dank für eure bisherige Hilfe. War gestern leider den ganzen Tag im Auto.
Ich habe mich vielleich doch etwas umständlich ausgedrückt. Und die Zeile BB habe ich auch vergessen, die soll nach der EE und vor der CC- Zeile ausgegeben werden.
Am Ende der Zeilen steht auch nicht AA-1 usw., sondern etwa so was: 000 00000000 0000000, mit dem AA1-1 bis AA2-1 wollte ich nur zeigen, daß bei Zeile AA ein neuer Abschnitt beginnt und das zwischen AA's zusammengehört. Daß bedeutet natürlich auch, daß nach Zeile AA2-1 ebenfalls die DD2-1 und DD2-2 evtl.DD2-3 zusammengefaßt werden müssen und unter AA2-1 stehen müssen. Gefolgt von EE2-1 und BB2-1.
Beim nächsten AA ist der Block wieder erledigt.
Asche auf mein Haupt.
Friemlers Batch finde ich den absoluten Wahnsinn, gibt es da eine Empfehlung für nen Einsteigerkurs?


Nochmals Danke an alle, für die schnelle bisherige Hilfe!!!!!

VVSS
Mitglied: Friemler
Friemler 08.09.2011 um 13:58:34 Uhr
Goto Top
Hallo -vvss-,

ich habe mein Script an Deine (nun präzisierten) Anforderungen angepasst.

Btr. Einsteigerkurs: Schau Dir mal mein Tutorial zur FOR-Schleife inkl. der Kommentare von Jeb-the-Batcher und pieh-ejdsch an.

Gruß
Friemler
Mitglied: vvss
vvss 08.09.2011 um 18:47:48 Uhr
Goto Top
Hallo Friemler,

danke für dein schnelle Hilfe. Bei größeren Dateien werden aber leider einige DD Zeilen nicht ausgegeben.
Könnten man evtl. noch zusammenhängende Leerstellen ab 5 Stück wegschneiden, oder die ersten 33 Zeichen der einzelnen DD- Zeilen weglassen?

Habe unter http://daten.duerrbeck.com/test1.txt mal eine Testdatei ohne FF- Zeilen hinterlegt.

Ich weiß übertreibe es jetzt etwas, aber schonmal Danke.


VVSS
Mitglied: pieh-ejdsch
pieh-ejdsch 08.09.2011 um 18:57:34 Uhr
Goto Top
moin vvss,

geht das komplett? auch die datei Draufziehen.
@echo off&setlocal
:: Bitte zuerst mit Testdaten Probieren
if not exist "%~1" goto :eof  
set "Begin=0"  
set "End=0"  
type nul >"%~dpn1-Neu%~x1"  
for /f tokens^=1^,*^ delims^=:^  %%i in ('" findstr /r /n /c:"^AA_" "%~1" & find /v /c "" < "%~1"" ') do (  
	setlocal enabledelayedexpansion
	set /a "End = %%i - 1"  
	if !Begin! equ %%i set /a "End = %%i"   
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal  
		set /a "Begin = %%i"  
		set /a "End = %%k"  
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do (
			for /f "tokens=1,2* delims=:_" %%m in ('findstr /n "^" "%~1" ^| findstr /b "%%l:" ') do (set "Line=%%o"  
				setlocal enabledelayedexpansion
				(
				for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p"  
				)||endlocal
	)	)	)
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l echo %%~n_!%%~l!  
	) & set "%%~l="  
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do set "%%l_%%m=" & echo %%m_%%n  
)>>"%~dpn1-Neu%~x1"  

[Edit]
Fehler Bereinigt
[/Edit]

Gruß Phil
Mitglied: vvss
vvss 09.09.2011 um 08:57:08 Uhr
Goto Top
Moin Phil,

das Script läuft durch.
Die CC- Zeilen dürfen nicht zusammengefaßt werden, diese müssen untereinader stehen bleiben.
Ne geile Sache wäre noch, daß in den DD- Zeilen die ersten 36 Zeichen (incl. DD_) nicht mit zusammengefaßt werden.
Datei Draufziehen ist eine mir neue und faszinierende Sache, das Aufrufen einer Datei mit variabem Name in einem bestimmten Ordner würde das Script noch perfekt machen.
Je mehr ich versuche das Script halbwegs zu verstehen, desto mehr %%- Zeichen werden es, so eine ganz kurze Erläuterung, daß ich nicht ganz dumm sterbe.

Vielen Dank !!!


Gruß Veit
Mitglied: pieh-ejdsch
pieh-ejdsch 09.09.2011 um 14:13:31 Uhr
Goto Top
moin vvss,

hier ist eines mit Ausfühlicher Erklärung
warum das Ding allerdings PaarPfade / Dateien nicht findet ist mir nicht klar es Tut jedenfalls
 :: Der Befehl wird nicht angezeigt; Echo Ausgabe wird dektiviert und eine Lokalisierung von Variablen Beginnt
@echo off&setlocal

:: Bitte zuerst mit Testdaten Probieren
 :: wenn der Erste (nicht unbedingt der Zweite) Parameter NICHT im Dateisystem Existiert wird der Batch nicht abgebrochen sondern Beendet
if not exist "%~1" goto :eof  

 :: Die Variablen Begin; End fürs Zeilenseparien werden gesetzt
set "Begin=0"  
set "End=0"  

 :: Die Datei wird als Kopie mit dem zusatz "-Neu" im Dateinamen erstellt  
type nul >"%~dpn1-Neu%~x1"  

 :: Die Forschleife gibt die Zeilennummern der Datei worin AA_ am Anfang gefunden wird nacheinander aus; zum Schluss die GesamtZeilenanzahl der Datei
for /f delims^=: %%i in ('findstr /r /n /c:"^AA_" "%~1" ^& find /v /c "" ^< "%~1"') do (  

	 :: Die Verzögerte Variablenauflösung wird Aktiviert und eine neue Lokalisierung der Variablen beginnt
	setlocal enabledelayedexpansion

	 :: Die ausgegebene ZeilenNummer wird minus 1 in die Variable End gesetzt
	set /a "End = %%i - 1"  

	 :: Wenn die Variable Beginn gleich der ZeilenNummer ist wird die die ZeilenNummer in die Variable End gesetzt
	if !Begin! equ %%i set /a "End = %%i"  

	 :: Diese Forschleife gibt die zur LaufZeit gültigen Variablen Begin; End in das 1. und 2. Token aus.
	 :: Die Verzögerung wird mittels beenden der Lokalisierung abgeschalten.
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal  

		 :: Die Variablen werden für spätere / weitere Nutzung gesetzt
		set /a "Begin = %%i"  
		set /a "End = %%k"  

		 :: Wenn das 2. Token (ende des Absatzes) größer als 0 ist wird die Forschleife ausgeführt
		 :: Die Anfangzeilennummer; die dazwischen und die EndZeilennummer werden nacheinander ausgegeben
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do (

			 :: die Zeilennummer des Absatzes wird gesucht; die Zeile wird im 2. ( %%n ) und 3. ( %%o ) Token ausgegeben
			 :: der Teil nach _ wird in die Variable Line gesetzt
			for /f "tokens=1,2* delims=:_" %%m in (' findstr /n "^" "%~1" 2^>nul ^| findstr /b "%%l:" 2^>nul ') do (set "Line=%%o"  
			
				 :: das hatten wir schon ...
				setlocal enabledelayedexpansion

				 :: hier die Ohne 1. 36 Zeichen im Anfang DD_ (minus 3)
				if "%%n" == "DD" set "Line=!Line:~33!"   

				 :: wenn das 2. ( %%n ) Token CC ist wird ; sonst das mit OHNE
				 :: die Variable Newline_<1.Token> und der Rest der Zeile i  AnführungsZeichen wird zu späteren Verwendung in die Variable Newline_<1.Token> gesetzt 
				if "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!" "!Line!") do endlocal & set "NewLine_%%n=%%p"  

				 :: hier mit OHNE AnführungsZeichen
				if not "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p"  

				 :: Ja wenn die Verzögerte Dings noch an is dann Ausmachen
				if "!os!" == "%os%" endloacal  
	)	)	)

	 :: Hier werden die Variablen in der gewünschten Reihenfolge ins Handle 3 ausgegeben und gelöscht
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l >&3 echo %%~n_!%%~l!  
	) & set "%%~l="  

	 :: Hier werden die restlichen Variablen beginnend mit Newline_ Alphabetisch ins Handle 3 ausgegeben und gelöscht
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do for %%o in ("%%n") do for /f %%p in ("%%~o") do set "%%l_%%m=" & >&3 echo %%m_%%~o  

 :: hier wird rem benutzt damit ein letzter Befehl und Keine LeerZeile oder Kommentarzeile mit :: die SchleifenKlammer zunichte macht
 :: keine Ahnung warum der eine Datei oder nen Pfad nicht findet aber die FehlerAusgabe kommt in die Tonne
 rem schreibe alle Eingaben von Handle 3 nacheinander in die Datei
) 3>>"%~dpn1-Neu%~x1" 2>nul  

Gruß Phil
Mitglied: 99045
99045 09.09.2011 um 15:49:53 Uhr
Goto Top
:: Bitte zuerst mit Testdaten Probieren
 :: wenn der Zweite Parameter NICHT im Dateisystem Existiert wird der Batch abgebrochen
if not exist "%~1" goto :eof


Und warum wird dann der 1. und nicht der 2. Parameter überprüft?
Mitglied: pieh-ejdsch
pieh-ejdsch 09.09.2011 um 16:52:11 Uhr
Goto Top
moin nick,

Ähhm ja was hab ich denn hier gemacht? Ich sach mal so soll nur der Lesetest Bestätigt werden. Schusselfehler.

Gruß Phil
Mitglied: vvss
vvss 12.09.2011 um 11:21:55 Uhr
Goto Top
Moin Phil,

vielen Dank für deine Mühe, bin begesitert. Versuche gerade das Script zuverstehen, muß aber glaube etwas weiter auholen. Wo wir wieder bei --Tutorial zur FOR-Schleife-- wären. Werde mich mal daran machen und vieleicht sogar teilweise zur Erleuchtung kommen.


Vielen Dank an alle.
Mitglied: vvss
vvss 20.09.2011 um 18:10:13 Uhr
Goto Top
Hallo zusammen,

habe mal versuchtdas Skript mit ein paar Pfadangaben zu erweitern.
Das scheint auch soweit zu laufen, nur die Ausgabedatei bleibt leer.
Wo ist mein Fehler?

Danke

Anbei das Skript:
###############################################################################################

 :: Der Befehl wird nicht angezeigt; Echo Ausgabe wird dektiviert und eine Lokalisierung von Variablen Beginnt
@echo on&setlocal

:: Bitte zuerst mit Testdaten Probieren

 :: Die Variablen werden gesetzt
set "Begin=0"  
set "End=0"  
set "Ausgabe=C:\SchnittstelleDBIS_Axthelm\konvertierte_Daten_Axthelm"  
set "logfile=C:\SchnittstelleDBIS_Axthelm\Skripte\Axthelm1.0\file.log"  

:: Die Datei wird im Ausgabepfad mit dem Dateinamen aus der file.log neu und leer erstellt
for /F %%A in (%logfile%) do (
	type nul >%Ausgabe%\"%%~nxA"  
	set "Ausgabedatei=%Ausgabe%\%%~nxA"  
	set Ausgabedatei
	set "Eingabedatei=%%A"  
	set Eingabedatei
	pause	
	)
	

 :: Die Forschleife gibt die Zeilennummern der Datei worin AA_ am Anfang gefunden wird nacheinander aus; zum Schluss die GesamtZeilenanzahl der Datei
for /f delims^=: %%i in ('findstr /r /n /c:"^AA_" "%Eingabedatei%" ^& find /v /c "" ^< "%Eingabedatei%"') do (  

	
	 :: Die Verzögerte Variablenauflösung wird Aktiviert und eine neue Lokalisierung der Variablen beginnt
	setlocal enabledelayedexpansion

	 :: Die ausgegebene ZeilenNummer wird minus 1 in die Variable End gesetzt
	set /a "End = %%i - 1"  
	set End
	pause
	 :: Wenn die Variable Beginn gleich der ZeilenNummer ist wird die die ZeilenNummer in die Variable End gesetzt
	if !Begin! equ %%i set /a "End = %%i"  
	set End
	pause
	 :: Diese Forschleife gibt die zur LaufZeit gültigen Variablen Begin; End in das 1. und 2. Token aus.
	 :: Die Verzögerung wird mittels beenden der Lokalisierung abgeschalten.
	for /f "tokens=1,2" %%j in ("!Begin! !End!") do (endlocal  

		 :: Die Variablen werden für spätere / weitere Nutzung gesetzt
		set /a "Begin = %%i"  
		set /a "End = %%k"  
		set Begin
		set End
		pause
		 :: Wenn das 2. Token (ende des Absatzes) größer als 0 ist wird die Forschleife ausgeführt
		 :: Die Anfangzeilennummer; die dazwischen und die EndZeilennummer werden nacheinander ausgegeben
		if %%k neq 0 for /l %%l in (%%j,1,%%k) do (

			 :: die Zeilennummer des Absatzes wird gesucht; die Zeile wird im 2. ( %%n ) und 3. ( %%o ) Token ausgegeben
			 :: der Teil nach _ wird in die Variable Line gesetzt
			for /f "tokens=1,2* delims=:_" %%m in (' findstr /n "^" "%Eingabedatei%" 2^>nul ^| findstr /b "%%l:" 2^>nul ') do (set "Line=%%o"  
			
				 :: das hatten wir schon ...
				setlocal enabledelayedexpansion

				 :: hier die Ohne 1. 36 Zeichen im Anfang DD_ (minus 3)
				if "%%n" == "DD" set "Line=!Line:~33!"   

				 :: wenn das 2. ( %%n ) Token CC ist wird ; sonst das mit OHNE
				 :: die Variable Newline_<1.Token> und der Rest der Zeile i  AnführungsZeichen wird zu späteren Verwendung in die Variable Newline_<1.Token> gesetzt 
				if "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!" "!Line!") do endlocal & set "NewLine_%%n=%%p"  
							
				 :: hier mit OHNE AnführungsZeichen
				if not "%%n" == "CC" for /f "delims=" %%p in ("!NewLine_%%n!!Line!") do endlocal & set "NewLine_%%n=%%p"  
						
															
				 :: Ja wenn die Verzögerte Dings noch an is dann Ausmachen
				if "!os!" == "%os%" endloacal  
	)	)	)

	 :: Hier werden die Variablen in der gewünschten Reihenfolge ins Handle 3 ausgegeben und gelöscht
	for %%l in ("Newline_AA" "Newline_DD" "Newline_EE") do for /f "tokens=1* delims=_" %%m in ("%%~l") do (cmd /von /c if defined %%~l >&3 echo %%~n_!%%~l!  
	) & set "%%~l="  

	 :: Hier werden die restlichen Variablen beginnend mit Newline_ Alphabetisch ins Handle 3 ausgegeben und gelöscht
	for /f "tokens=1,2* delims=_=" %%l in ('set Newline_ 2^>nul') do for %%o in ("%%n") do for /f %%p in ("%%~o") do set "%%l_%%m=" & >&3 echo %%m_%%~o  

  ) 3>>%Ausgabedatei% 2>nul

[Edit Biber] Codeformatierung, falls es jemand lesen will. [/Edit]
Mitglied: Biber
Biber 20.09.2011 um 19:23:35 Uhr
Goto Top
Moin -vvss-,

wahrscheinlich stimmen Wunsch in Zeile 76 und Wirklichkeit in Zeile 77 und 81 nicht überein.

Setze doch mal das kryptische Gestrunkele "if defined %%~l >&3 " ein wenig kryptischer zu machen.
Maskiere die Sonderzeichen ">" und "&" und "3" jeweisl mit einem Caret (^)

Ziel: "if defined %%~l ^>^&^3 "

Obwohl.... wenn Batchskripte so kompliziert aussähen müssten, dann wären bis heute so drei bis fünf zum Laufen gekommen.
Wer soll den ### denn warten und pflegen?

Grüße
Biber
Mitglied: pieh-ejdsch
pieh-ejdsch 20.09.2011 um 21:52:06 Uhr
Goto Top
moin -vvss-,

die extraUmleitung des Handle 3 sollte normal schon so in Ordnung sein.
&>3
Das habe ich aber nur gemacht, damit ich die Batch mit Angeschaltenem Echo Testen konnte und nur die gewünschte Ausgabe in der Datei hatte.
Wenn die Batch mit "echo off" läuft, braucht natürlich nicht erst in Handle 3 und dann von da in die Datei umgeleitet werden.

schau dir mal die Ausgabe bis zur Pause an - was wird da speziell ausgegeben? Einzelne Zeilen der Datei oder garnichts.
was steht in der "file.log" drin?

PS: den Komplett Durchkommentierten Batch brauchst Du nicht zu posten; es sollte ja nur für Dich als Erklärung der vielen Prozentzeichen dienen.

Gruß Phil
Mitglied: vvss
vvss 21.09.2011 um 17:49:25 Uhr
Goto Top
Hallo Phil,

ich werd verrückt es funktioniert.
In file.log steht der gerade bearbeitete Dateiname drin, wenn im Eingabeorder mehrer Dateien sind werden diese nacheinander abgearbeitet.
Den Sinn von einem Handle und dem Escapen^, habe ich zwar noch nicht ganz verstanden, bleibe aber mit dem Workshop Batch for Runaways - Part II am Ball.


Danke

Veit