Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Minister05

Minister05 (Level 1) - Jetzt verbinden

01.10.2013 um 15:06 Uhr, 1300 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 ..
Ähnliche Inhalte
Windows Server

Gruppenrichtlinienvererberung einzeln deaktivieren

gelöst Frage von xbast1xWindows Server4 Kommentare

Hallo zusammen, ich habe eine Haupt OU mit einer Sub OU. Die Sub OU bekommt die GPO von der ...

Schulung & Training

Ct einzeln als PDF?

gelöst Frage von honeybeeSchulung & Training2 Kommentare

Hallo, vielleicht bin ich einfach zu doof, aber gibt es die derzeit aktuelle c't nicht mehr als PDF? Ich ...

Outlook & Mail

Kalendereinträge einzeln filtern und exportieren

Frage von GraudonOutlook & Mail4 Kommentare

Hallo zusammen, ich suche eine Möglichkeit, Kalendereinträge nach bestimmten Kriterien (z.B. Name, Kategorie, Url) zu filtern und dann in ...

LAN, WAN, Wireless

ESXi-Server NIC Trunking vs. Einzeln

Frage von killtecLAN, WAN, Wireless33 Kommentare

Hallo, wir haben bei uns mehrere Server (ESXi) wo jeweils die einzelnen NICS separat auf den Switch gehen. Ich ...

Neue Wissensbeiträge
Humor (lol)

Warum Linux in einer vernetzten Welt einfach keinen Komfort bietet!

Tipp von Snowbird vor 16 StundenHumor (lol)12 Kommentare

Ein interessanter Einblick warum Linux nichts für Geräteübergreifende Arbeit ist :)

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von Lochkartenstanzer vor 1 TagHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Windows Update

KB4517297 verfügbar, behebt Fehler in VB6 VBA VBScript

Information von sabines vor 1 TagWindows Update

Das Update behebt mögliche Fehler in VB6, VBA und VBScript, die durch das Update KB4512486 vom August entstanden sind. ...

Viren und Trojaner

Staatstrojaner soll auch per Einbruch installiert werden können

Information von transocean vor 2 TagenViren und Trojaner5 Kommentare

Moin, Bundesinnenminister Horst Seehofer will dem Verfassungsschutz Wohnungseinbrüche erlauben, um den geplanten Staatstrojaner zu installieren. Gruß Uwe

Heiß diskutierte Inhalte
Hyper-V
Bei Neuaufbau auf Core-Server setzen?
gelöst Frage von dertowaHyper-V33 Kommentare

Hallo zusammen, ich habe vor einigen Monaten die Verantwortung für eine EDV-Landschaft übernommen die seit Jahren von einem Dienstleister ...

Router & Routing
Deinstalliertes Geräte wird in FritzBox noch immer als verbundenes Gerät angezeigt
Frage von imebroRouter & Routing14 Kommentare

Hallo, in meiner FritzBox 7490 wird im Bereich "Funknetz" ein Gereät bei den verbundenen Geräten angezeigt, wobei ich nicht ...

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von LochkartenstanzerHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Batch & Shell
PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung
Frage von Pat.batBatch & Shell13 Kommentare

Hallo zusammen, ich stoße momentan auf folgendes Problem. Ich möchte mit meinem Skript E-Mails versenden. Text und Signatur samt ...