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, 1285 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)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 1 TagHumor (lol)2 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 2 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 5 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 5 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
SSD zeigt falsche Werte
Frage von karl2014Festplatten, SSD, Raid25 Kommentare

Ich habe ein Problem mit der SSD in meinem Laptop mit Windows 10. Es ist eine 1Tb Platte die ...

Windows 10
Windows Enterprise 1809 Eval nicht bootbar
Frage von Sunny89Windows 1022 Kommentare

Hallo zusammen, bevor ich mich jetzt noch stundenlang rumärger wollte ich euch fragen, ob Ihr die gleichen Probleme habt ...

Ubuntu
Installation freerdp 2.0.0-rc4
Frage von kristovUbuntu20 Kommentare

Hallo, möchte freerdp 2.0.0-rc4 auf linux mint 18.3 installieren, habe aber keine Ahnung, wie das funktioniert. freerdp 1.1 ist ...

Router & Routing
VPN u. WLAN Router für Reisen
Frage von stephan902Router & Routing17 Kommentare

Hallo, ich bin auf der Suche nach einem VPN/WLAN-Router für unterwegs. Und zwar möchte ich auf Reisen einfach den ...