mtb4ever
Goto Top

Mit Batch Datei suchen und ersetzen

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 (Mal wieder) Suchen und Ersetzen mittels Batch-Datei bereits folgendes Script entnommen und ein bisschen angepasst.

@echo off & setlocal
set "Von=Modul.Einstellung=Einstellung1"  
set "Nach=Modul.Einstellung=Einstellung2"  
set "Datei=c:\temp\Config.properties"  
If exist %temp%\new.txt del %temp%\new.txt

For /F "delims=" %%i in (%Datei%) do (  
   Echo %%i|Findstr /b "%Von% >nul  
   If Errorlevel 1 ( 
          echo %%i>>%temp%\new.txt
   ) Else (
          echo %Nach%>>%temp%\new.txt
))
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

Content-ID: 168523

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

Ausgedruckt am: 25.11.2024 um 14:11 Uhr

Skyemugen
Skyemugen 23.06.2011 um 13:49:32 Uhr
Goto Top
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é
bastla
bastla 23.06.2011 um 13:53:11 Uhr
Goto Top
Hallo MTB4ever!

Wenn's denn Batch (und nicht VBS) sein soll, versuch es damit:
@echo off & setlocal
set "Von=Modul.Einstellung=Einstellung1"  
set "Nach=Modul.Einstellung=Einstellung2"  
set "Datei=c:\temp\Config.properties"  
if exist %temp%\new.txt del %temp%\new.txt

for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%"') do (  
    setlocal enabledelayedexpansion
    set "Zeile=%%j"  
    echo !Zeile!|findstr /b "%Von%">nul && (echo %Nach%)||(echo\!Zeile!)  
    endlocal
)>>%temp%\new.txt 2>nul

move "%temp%\new.txt" "%Datei%"  
Grüße
bastla

P.S.: Im Threadtitel gibt es für meinen Geschmack ein "Datei" zuviel ... face-wink
Friemler
Friemler 23.06.2011 um 14:12:23 Uhr
Goto Top
Hallo MTB4ever,

... oder gleich ein VBScript, dann gibt es überhaupt keine Probleme mit irgendwelchen Zeichen:
Const ForReading = 1
Const ForWriting = 2
Const AsASCII    = 0

strInfilePath = "C:\Temp\Config.properties"  
strPattern    = "Modul.Einstellung=Einstellung1"  
strReplace    = "Modul.Einstellung=Einstellung2"  


Set objFSO = CreateObject("Scripting.FileSystemObject")  

Set objInFile = objFSO.OpenTextFile(strInfilePath, ForReading, False, AsASCII)
strContent    = objInFile.ReadAll
objInFile.Close

strContent = Replace(strContent, strPattern, strReplace)

strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _  
             objFSO.GetBaseName(strInFilePath) & "_new." & _  
             objFSO.GetExtensionName(strInFilePath)

Set objOutFile = objFSO.OpenTextFile(strOutFile, ForWriting, True, AsASCII)
objOutFile.Write strContent
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
bastla
bastla 23.06.2011 um 15:05:50 Uhr
Goto Top
@Friemler
Bei dieser epischen Darstellung face-wink fehlt dann aber noch
'...  
strSuffix     = "_new"  
'...  
strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _  
             objFSO.GetBaseName(strInFilePath) & strSuffix & "." & _  
             objFSO.GetExtensionName(strInFilePath)
'...  
Set objInFile  = Nothing
Set objOutFile = Nothing
Set objFSO     = Nothing
Grüße
bastla

P.S.: Die "Dim"-Zeilen habe ich uns erspart ... face-wink
Friemler
Friemler 23.06.2011 um 15:34:09 Uhr
Goto Top
@bastla
Von wegen episch: Ich hätte natürlich auch das hier schreiben können:
sPattern = "Modul.Einstellung=Einstellung1"  
sReplace = "Modul.Einstellung=Einstellung2"  
Set oFSO = CreateObject("Scripting.FileSystemObject")  
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
bastla
bastla 23.06.2011 um 15:40:45 Uhr
Goto Top
@Friemler
Die Zeile 4 ginge auch noch kürzer face-wink ...

... aber ein Mittelding wär' mein Ding face-wink:
strInfilePath = "C:\Temp\Config.properties"  
strPattern    = "Modul.Einstellung=Einstellung1"  
strReplace    = "Modul.Einstellung=Einstellung2"  
strSuffix     = "_new"  

Set objFSO = CreateObject("Scripting.FileSystemObject")  

strOutFile = objFSO.GetParentFolderName(strInFilePath) & "\" & _  
             objFSO.GetBaseName(strInFilePath) & strSuffix & "." & _  
             objFSO.GetExtensionName(strInFilePath)

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
Friemler
Friemler 23.06.2011 um 15:48:08 Uhr
Goto Top
@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
bastla
bastla 23.06.2011 um 15:58:59 Uhr
Goto Top
@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 ... face-wink

Grüße
bastla
MTB4ever
MTB4ever 27.06.2011 um 12:10:19 Uhr
Goto Top
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