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

Mit Batch Datei suchen und ersetzen

Frage Entwicklung Batch & Shell

Mitglied: MTB4ever

MTB4ever (Level 1) - Jetzt verbinden

23.06.2011 um 13:22 Uhr, 4366 Aufrufe, 9 Kommentare

Hallo,

ich habe folgendes Problem: Und zwar habe ich eine Config Datei die ich mit Hilfe einer Batch Datei durchsuchen möchte und eine bestimmte Einstellung ersetzen möchte.
Ich habe aus den Beitrag https://www.administrator.de/index.php?content=90771 bereits folgendes Script entnommen und ein bisschen angepasst.

01.
@echo off & setlocal 
02.
set "Von=Modul.Einstellung=Einstellung1" 
03.
set "Nach=Modul.Einstellung=Einstellung2" 
04.
set "Datei=c:\temp\Config.properties" 
05.
If exist %temp%\new.txt del %temp%\new.txt 
06.
 
07.
For /F "delims=" %%i in (%Datei%) do ( 
08.
   Echo %%i|Findstr /b "%Von% >nul 
09.
   If Errorlevel 1 (  
10.
          echo %%i>>%temp%\new.txt 
11.
   ) Else ( 
12.
          echo %Nach%>>%temp%\new.txt 
13.
)) 
14.
move %temp%\new.txt %Datei%
Dieses Script funktioniert schon fast, aber in der Config-Datei werden momentan alle Leerzeilen (die für die Übersichtlichkeit enthalten sind) gelöscht und das sollte nicht passieren.

Ausserdem werden momentan noch extra Dateien angelegt (warum kann ich mir nicht erklären). Ich habe bereits rausgefunden, dass die Dateien die angelegt werden den Dateinamen haben, der nach einen > , [,] oder < folgt. Also wenn z.B. in der Config Datei ein Kommentar mit den Namen "### (siehe Programm-> Menü->Einstellung). [BSP:][200]" enthalten ist wird eine Datei mit den Namen "Einstellung)" erstellt. Dass müsste auch noch verboten werden, es soll wirklich nur die Eingangsdatei geändert werden und keine neue Datei (ausser eventuell die temp Datei) erstellt werden.

Kann mir da einer von euch weiter helfen ?

MfG Michael
Mitglied: Skyemugen
23.06.2011 um 13:49 Uhr
Aloha,

nur erst einmal kurz am Vorbeischauen: Zeile 8: "%Von% was fehlt? ja, das hat schon bei Bibers Ausführung gefehlt, dürfte dir aber hier auf den Fuß fallen

In Sachen gelöschte Leerzeichen gab's hier schon ein- oder zweimal etwas als Skript, müsstest du evtl. mal kurz suchen, ob du direkt fündig wirst.

greetz André
Bitte warten ..
Mitglied: bastla
23.06.2011 um 13:53 Uhr
Hallo MTB4ever!

Wenn's denn Batch (und nicht VBS) sein soll, versuch es damit:
01.
@echo off & setlocal 
02.
set "Von=Modul.Einstellung=Einstellung1" 
03.
set "Nach=Modul.Einstellung=Einstellung2" 
04.
set "Datei=c:\temp\Config.properties" 
05.
if exist %temp%\new.txt del %temp%\new.txt 
06.
 
07.
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do ( 
08.
    setlocal enabledelayedexpansion 
09.
    set "Zeile=%%j" 
10.
    echo !Zeile!|findstr /b "%Von%">nul && (echo %Nach%)||(echo\!Zeile!) 
11.
    endlocal 
12.
)>>%temp%\new.txt 2>nul 
13.
 
14.
move "%temp%\new.txt" "%Datei%"
Grüße
bastla

P.S.: Im Threadtitel gibt es für meinen Geschmack ein "Datei" zuviel ...
Bitte warten ..
Mitglied: Friemler
23.06.2011 um 14:12 Uhr
Hallo MTB4ever,

... oder gleich ein VBScript, dann gibt es überhaupt keine Probleme mit irgendwelchen Zeichen:
01.
Const ForReading = 1 
02.
Const ForWriting = 2 
03.
Const AsASCII    = 0 
04.
 
05.
strInfilePath = "C:\Temp\Config.properties" 
06.
strPattern    = "Modul.Einstellung=Einstellung1" 
07.
strReplace    = "Modul.Einstellung=Einstellung2" 
08.
 
09.
 
10.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
11.
 
12.
Set objInFile = objFSO.OpenTextFile(strInfilePath, ForReading, False, AsASCII) 
13.
strContent    = objInFile.ReadAll 
14.
objInFile.Close 
15.
 
16.
strContent = Replace(strContent, strPattern, strReplace) 
17.
 
18.
strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _ 
19.
             objFSO.GetBaseName(strInFilePath) & "_new." & _ 
20.
             objFSO.GetExtensionName(strInFilePath) 
21.
 
22.
Set objOutFile = objFSO.OpenTextFile(strOutFile, ForWriting, True, AsASCII) 
23.
objOutFile.Write strContent 
24.
objOutFile.Close
Es wird im Verzeichnis der Quelldatei eine neue Datei erstellt, die den Namen der Originaldatei mit dem Zusatz _new erhält, die Dateierweiterung bleibt gleich.

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
23.06.2011 um 15:05 Uhr
@Friemler
Bei dieser epischen Darstellung fehlt dann aber noch
01.
'... 
02.
strSuffix     = "_new" 
03.
'... 
04.
strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _ 
05.
             objFSO.GetBaseName(strInFilePath) & strSuffix & "." & _ 
06.
             objFSO.GetExtensionName(strInFilePath) 
07.
'... 
08.
Set objInFile  = Nothing 
09.
Set objOutFile = Nothing 
10.
Set objFSO     = Nothing
Grüße
bastla

P.S.: Die "Dim"-Zeilen habe ich uns erspart ...
Bitte warten ..
Mitglied: Friemler
23.06.2011 um 15:34 Uhr
@bastla
Von wegen episch: Ich hätte natürlich auch das hier schreiben können:
01.
sPattern = "Modul.Einstellung=Einstellung1" 
02.
sReplace = "Modul.Einstellung=Einstellung2" 
03.
Set oFSO = CreateObject("Scripting.FileSystemObject") 
04.
oFSO.CreateTextFile("C:\Temp\Config_new.properties", True).Write Replace(oFSO.OpenTextFile("C:\Temp\Config.properties", 1, False).ReadAll, sPattern, sReplace)
Aber wem wäre damit gedient gewesen? Nicht mal der effektiv auf der Festplatte belegte Speicher hätte sich dadurch geändert.

Dateien schließe ich lieber während des Programmlaufs, die Objekte kann ja VBS zum Scriptende vernichten.

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
23.06.2011 um 15:40 Uhr
@Friemler
Die Zeile 4 ginge auch noch kürzer ...

... aber ein Mittelding wär' mein Ding :
01.
strInfilePath = "C:\Temp\Config.properties" 
02.
strPattern    = "Modul.Einstellung=Einstellung1" 
03.
strReplace    = "Modul.Einstellung=Einstellung2" 
04.
strSuffix     = "_new" 
05.
 
06.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
07.
 
08.
strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _ 
09.
             objFSO.GetBaseName(strInFilePath) & strSuffix & "." & _ 
10.
             objFSO.GetExtensionName(strInFilePath) 
11.
 
12.
objFSO.CreateFile(strOutFile).Write Replace(objFSO.OpenTextFile(strInFilePath).ReadAll, strPattern, strReplace)
Dateien schließe ich lieber während des Programmlaufs
Ich auch (zumindest solche mit Schreibzugriff) - wenn's denn noch länger läuft ...

Grüße
bastla
Bitte warten ..
Mitglied: Friemler
23.06.2011 um 15:48 Uhr
@bastla
Tja, so hat halt jeder seinen Stil.

Ich schreibe lieber "Romane", die sich wie ein Buch lesen lassen, aber dadurch auf den ersten Blick auch verständlich sind. Ich mag keine unnötigen Bandwurmzeilen.

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
23.06.2011 um 15:58 Uhr
@Friemler
Tja, so hat halt jeder seinen Stil.
Natürlich - wobei sich der meine über die letzten Jahre hinweg durchaus noch verändert hat ...
Ich mag keine unnötigen Bandwurmzeilen.
Für mich steigert sich das sogar noch zu: Ich mag überhaupt keine unnötigen Zeilen ...

Grüße
bastla
Bitte warten ..
Mitglied: MTB4ever
27.06.2011 um 12:10 Uhr
Hallo,

vielen Dank für eure Hilfe. Habe mich dazu entschlossen das VB-Script aus Kommentar 2 von Friemler (schreibt am 23.06.2011, 14:12:23 Uhr ) zu nehmen.
Problem wurde damit gelöst!

Viele Grüße
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...