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.
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 168523
Url: https://administrator.de/contentid/168523
Ausgedruckt am: 25.11.2024 um 14:11 Uhr
9 Kommentare
Neuester Kommentar
Aloha,
nur erst einmal kurz am Vorbeischauen: Zeile 8:
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é
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ß fallenIn 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é
Hallo MTB4ever!
Wenn's denn Batch (und nicht VBS) sein soll, versuch es damit:
Grüße
bastla
P.S.: Im Threadtitel gibt es für meinen Geschmack ein "Datei" zuviel ...
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%"
bastla
P.S.: Im Threadtitel gibt es für meinen Geschmack ein "Datei" zuviel ...
Hallo MTB4ever,
... oder gleich ein VBScript, dann gibt es überhaupt keine Probleme mit irgendwelchen Zeichen:
Es wird im Verzeichnis der Quelldatei eine neue Datei erstellt, die den Namen der Originaldatei mit dem Zusatz
Gruß
Friemler
... 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
@Friemler
Bei dieser epischen Darstellung fehlt dann aber noch
Grüße
bastla
P.S.: Die "
Bei dieser epischen Darstellung 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
bastla
P.S.: Die "
Dim
"-Zeilen habe ich uns erspart ...
@bastla
Von wegen episch: Ich hätte natürlich auch das hier schreiben können:
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
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)
Dateien schließe ich lieber während des Programmlaufs, die Objekte kann ja VBS zum Scriptende vernichten.
Gruß
Friemler
@Friemler
Die Zeile 4 ginge auch noch kürzer ...
... aber ein Mittelding wär' mein Ding :
Grüße
bastla
Die Zeile 4 ginge auch noch kürzer ...
... aber ein Mittelding wär' mein Ding :
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
@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
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
@Friemler
Grüße
bastla
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