Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Textdateien durchsuchen und einzelne Parameter ändern

Frage Entwicklung Batch & Shell

Mitglied: Minister05

Minister05 (Level 1) - Jetzt verbinden

01.10.2013 um 15:06 Uhr, 1250 Aufrufe, 11 Kommentare, 2 Danke

Hallo zusammen!
Ich habe ein Problem welches ich alleine nicht gelöst bekomme…leider sind meine Kenntnisse im Bereich Batchprogrammierung nicht wirklich groß, daher hoffe ich hier Hilfe zu finden. Konkret geht es um folgende Aufgabe:

In einem Ordner1 existiert eine Grunddatei.txt
In einem weiteren Ordner2 existieren mehrere Testdateien.txt

Die Grunddatei sieht in etwa so aus:

;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxx
;xxxx
;xxxxxxxxxxxxxx
PAR_1=
PAR_2=
;xxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=
PAR_4=
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxx
;xxxxxxxx
PAR_5

Usw.

Eine Testdatei hat diesen Inhalt, wobei die Zahlen in jeder Testdatei unterschiedlich sind:

;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=0,1,0,2
PAR_4=0,5,4,32
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx

Es soll jetzt jeweils die aktuelle Testdatei durchsucht werden nach Zeilen die nicht mit “;“ anfangen. Diese Zeilen sollen bis einschließlich dem Gleichheitszeichen übernommen werden und mit der Grunddatei verglichen werden. Anschließend sollen die Parameter genau an die richtige Stelle in der Grunddatei geschrieben werden (inkl. Zahlen). Das Endergebnis, welches separat abgespeichert werden soll, muss dann so aussehen:
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxx
;xxxx
;xxxxxxxxxxxxxx
PAR_1=
PAR_2=
;xxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxx
PAR_3=0,1,0,2
PAR_4=0,5,4,32
;xxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxxxxxxxxxxxxxx
;xxxxxxxxxxxx
;xxxxxxxx
PAR_5

Damit wäre Testfall1 fertig. Analog soll danach mit allen weiteren Dateien verfahren werden, die in diesem Ordner mit “Testfall“ beginnen, so dass am Ende folgendes im Ordner zu finden ist.

In Ordner1 existiert weiterhin die Grunddatei.txt

In Ordner2 existieren: Testdatei1.txt
Testdatei2.txt
Testdatei3.txt
Testdatei4.txt
TestNeu1.txt
TestNeu2.txt
TestNeu3.txt
TestNeu4.txt

Die Grunddatei muss so flexibel sein, dass ich sie für jeden beliebigen Ordner mit Testfällen verwenden kann, daher ist es so umständlich…also immer Zugriff auf Unterordner, Datei laden, schauen welche Parameter zu ändern sind und erst dann zurück in die Grunddatei und dort entsprechend ändern und unter neuem Namen abspeichern. Weiß jemand Rat?
Mitglied: Endoro
02.10.2013 um 02:42 Uhr
Zitat von Minister05:
Weiß jemand Rat?

Hi, klar doch !
01.
@echo off &setlocal 
02.
set "gfile=Ordner1\Grunddatei.txt" 
03.
del "Ordner2\TestNeu*.txt" 2>nul 
04.
for %%a in (Ordner2\Testdatei*.txt) do ( 
05.
	set /a cnt+=1 
06.
	for /f "delims==" %%b in ('^<"%gfile%" find "="') do set "%%b=" 
07.
	for /f %%b in ('^<"%%~a" find "="') do set "%%~b" 
08.
	for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do ( 
09.
		set "line=%%c" 
10.
		set "prop=" 
11.
		setlocal enabledelayedexpansion 
12.
		set "line=!line:*:=!" 
13.
		for /f "eol==delims==" %%d in ("!line!") do set "prop=%%d" 
14.
		if "!line!" neq "!prop!" for /f %%d in ('set "!prop!" 2^>nul') do set "line=%%d" 
15.
		>>"Ordner2\TestNeu!cnt!.txt" echo(!line! 
16.
		endlocal 
17.
18.
19.
type "Ordner2\TestNeu*.txt"
lg.
Bitte warten ..
Mitglied: Minister05
02.10.2013 um 09:29 Uhr
Also zunächst mal vielen Dank für die schnelle Hilfe!!Es läuft auch soweit,macht was es machen soll. Nur leider macht es auch zwei Sachen die es nicht machen soll...

Zum einen macht es in einer Zeile aus einem

VS=
ein
VSEDEFLOGDIR=C:\ProgramData\McAfee\DesktopProtection

zum anderen hab ich eine Zeile in der Grunddatei wo nicht PAR_*= steht sondern nur PAR=
Daraus macht er natürlich dann auch den Wert der in der Testdatei steht...

Kann man da was dran machen?
Bitte warten ..
Mitglied: Endoro
02.10.2013 um 12:22 Uhr
Hi, ich habe eine Prise Regex reingemischt. Aber es wird auch langsamer so. Falls es zu langsam ist, solltest du das anders lösen, zB mit awk.
01.
@echo off &setlocal 
02.
set "gfile=Ordner1\Grunddatei.txt" 
03.
del "Ordner2\TestNeu*.txt" 2>nul 
04.
for %%a in (Ordner2\Testdatei*.txt) do ( 
05.
	set /a cnt+=1 
06.
	for /f "delims==" %%b in ('findstr /brc:"PAR_[0-9][0-9]*=" "%gfile%"') do set "%%b=" 
07.
	for /f %%b in ('findstr /brc:"PAR_[0-9][0-9]*=" "%%~a"') do set "%%~b" 
08.
	for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do ( 
09.
		set "line=%%c" 
10.
		set "prop=" 
11.
		setlocal enabledelayedexpansion 
12.
		set "line=!line:*:=!" 
13.
		if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!"^|findstr /brc:"\"PAR_[0-9][0-9]*\""') do set "prop=%%~d" 
14.
		if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%d" 
15.
		>>"Ordner2\TestNeu!cnt!.txt" echo(!line! 
16.
		endlocal 
17.
18.
19.
type "Ordner2\TestNeu*.txt" 
20.
 
lg.
Bitte warten ..
Mitglied: Minister05
02.10.2013 um 14:31 Uhr
Hmmm....
Jetzt schreibt er allerdings auch den Parameter nicht mehr in die TestNeu*.txt, den ich geändert haben wollte, sondern das Ergebnis ist gleich der Grunddatei.txt
Bitte warten ..
Mitglied: Endoro
02.10.2013 um 16:45 Uhr
Hi, also: funktioniert hier. Bitte auf c&p-Fehler, Pfade usw. überprüfen.
Sessionfoto
lg.
Bitte warten ..
Mitglied: Minister05
14.10.2013 um 14:25 Uhr
Hi, sorry war letzte Woche unterwegs...also die Datei läuft, zumindest das Beispiel was ich eingestellt habe...in meiner Originaldatei heißen die Parameter jedoch nicht PAR_1 usw sondern PS1_VAR= und PS2_VAR=

Dachte das macht keinen Unterschied, aber anscheinend wohl doch...hab jetzt in den Zeilen
6, 7 und 13 deines Programms folgendes geändert:

@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('findstr /brc:"*_[A-Z][A-Z]=" "%gfile%"') do set "%%b="
for /f %%b in ('findstr /brc:"*_[A-Z][A-Z]=" "%%~a"') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!"^|findstr /brc:"\"*_[A-Z][A-Z]\""') do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
type "Ordner2\TestNeu*.txt"


Doch leider läuft das nicht, er speichert als neue Dateien wie zuvor beschrieben quasi eine Kopie der Grunddatei neu ab...bin hier echt langsam am verzweifeln
Bitte warten ..
Mitglied: Endoro
15.10.2013 um 00:21 Uhr
Hi, dein regulärer Ausdruck ist ungültig.
PS1_VAR= und PS2_VAR=
PS[0-9][0-9]*_VAR=
lg.
Bitte warten ..
Mitglied: Minister05
15.10.2013 um 06:27 Uhr
Hi und guten morgen!
Danke dass du dich so rührend um mich kümmerst...inzwischen schreibt die Batch alles richtig in die Grunddatei
Das einzige was noch stört ist, dass an einer Stelle, nämlich beim Parameter der Form

OS=
am Ende
OS=WINDOWS_NT
steht...

wenn ich das noch weg bekäme, wäre es P*E*R*F*E*K*T

Die Batch sieht jetzt so aus


@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('^<"%gfile%" findstr "[A-Z]*_[A-Z]*="') do set "%%b="
for /f %%b in ('^<"%%~a" findstr "[A-Z]*_[A-Z]*="') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f "eol==delims==" %%d in ("!line!") do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%~d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
Bitte warten ..
Mitglied: Minister05
15.10.2013 um 13:03 Uhr
So...läuft jetzt...auch ohne den WINDOWS_NT Quatsch...

@echo off &setlocal
set "gfile=Ordner1\Grunddatei.txt"
del "Ordner2\TestNeu*.txt" 2>nul
for %%a in (Ordner2\Testdatei*.txt) do (
set /a cnt+=1
for /f "delims==" %%b in ('^<"%gfile%" findstr "[A-Z]*_[A-Z]*="') do set "%%b="
for /f %%b in ('^<"%%~a" findstr "[A-Z]*_[A-Z]*="') do set "%%~b"
for /f "delims=" %%c in ('findstr /n "^" "%gfile%"') do (
set "line=%%c"
set "prop="
setlocal enabledelayedexpansion
set "line=!line:*:=!"
if "!line:~-1!"=="=" for /f %%d in ('echo "!line:~0,-1!" ^|findstr "[A-Z]*_[A-Z]*"') do set "prop=%%~d"
if defined !prop! for /f %%d in ('set "!prop!"') do set "line=%%~d"
>>"Ordner2\TestNeu!cnt!.txt" echo(!line!
endlocal
)
)
type "Ordner2\TestNeu*.txt"

ENDLICH!!! VIELEN DANK!!!

Jetzt nur noch eine Schönheitsfrage....wenn ich die neue und die Grunddatei in Notepad++ schmeiße und vergleiche, würde ich gerne sehen, dass der geänderte Parameter nicht übereinstimmt. Müsste ja klappen, jedoch wird die komplette Datei als unterschiedlich angezeigt. Das Problem ist, dass in der neuen Datei TestNeu.txt an jedem Zeilenende ein Leerzeichen steht. Bekomme ich das noch weg?
Bitte warten ..
Mitglied: Endoro
15.10.2013 um 20:35 Uhr
Da sitzt wahrscheinlich ein Leerzeichen.
Ändere diese Zeile so ab:
01.
>>"Ordner2\TestNeu!cnt!.txt" (echo(!line!)
lg.
Bitte warten ..
Mitglied: Minister05
16.10.2013 um 06:31 Uhr
Super, funktioniert perfekt!! Danke dir vielmals!!!!!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Exchange Server
Einzelne Signatur ändern - Exchange 2010 (3)

Frage von iAmbricksta zum Thema Exchange Server ...

Batch & Shell
gelöst New-ADUser (optional Parameter) (13)

Frage von mc-doubleyou zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...