Batch zum erstellen von Textdateien von Textvorlage
Hallo,
ich habe mal ein Anliegen an die Batch-Profis hier. Ich bin absolut keiner, bin aber auf der Suche nach einer guten Lösung und habe auch schon versucht über die Suche etwas zu finden, finde aber immer nur ähnliche Vorhaben und die werden teilweise mit sehr unterschiedlichen Varianten gelöst. Also es geht um folgendes:
Ich habe eine (mehrzeilige) Textdatei in der ich ein bestimmtes Wort ersetzen und die Datei anschließend unter einem neuen Namen speichern möchte. Im Prinzip hätte ich sogar gerne zwei Varianten:
1. Eine Batch die eine Benutzeringabe abfragt welche den Inhalt angibt mit dem dieses eine bestimmte Wort ersetzt wird (ich nenne es mal "Ersatzwort"). Der Dateiname ist eigentlich relativ egal, im Prinzip kann es auch die Eingabe als Dateinamen benutzen.
2. Eine zweite schöne Variante wäre noch, wenn man der Batch sagen könnte, dass es eine weitere Textadatei quasi als Eingabedatei benutzt. Diese würde jede Eingabe in einer einzelnen Zeile enthalten, sprich für jede Zeile in dieser Textdatei, würde eine neue Textdatei entstehen, in der dieses "Ersatzwort" durch die Textzeile ersetzt wird.
Ich hoffe das Ganze verständlich beschrieben zu haben und eine schöne Lösung dazu zu erhalten. Ich weiß, dass es sicher mehrere Möglichkeiten gibt sich das so irgendwie hinzubasteln, bin aber auch sehr daran interessiert was mir die Experten hier als die eleganteste Lösung vorschlagen...
Vielen Dank schonmal vorweg
ich habe mal ein Anliegen an die Batch-Profis hier. Ich bin absolut keiner, bin aber auf der Suche nach einer guten Lösung und habe auch schon versucht über die Suche etwas zu finden, finde aber immer nur ähnliche Vorhaben und die werden teilweise mit sehr unterschiedlichen Varianten gelöst. Also es geht um folgendes:
Ich habe eine (mehrzeilige) Textdatei in der ich ein bestimmtes Wort ersetzen und die Datei anschließend unter einem neuen Namen speichern möchte. Im Prinzip hätte ich sogar gerne zwei Varianten:
1. Eine Batch die eine Benutzeringabe abfragt welche den Inhalt angibt mit dem dieses eine bestimmte Wort ersetzt wird (ich nenne es mal "Ersatzwort"). Der Dateiname ist eigentlich relativ egal, im Prinzip kann es auch die Eingabe als Dateinamen benutzen.
2. Eine zweite schöne Variante wäre noch, wenn man der Batch sagen könnte, dass es eine weitere Textadatei quasi als Eingabedatei benutzt. Diese würde jede Eingabe in einer einzelnen Zeile enthalten, sprich für jede Zeile in dieser Textdatei, würde eine neue Textdatei entstehen, in der dieses "Ersatzwort" durch die Textzeile ersetzt wird.
Ich hoffe das Ganze verständlich beschrieben zu haben und eine schöne Lösung dazu zu erhalten. Ich weiß, dass es sicher mehrere Möglichkeiten gibt sich das so irgendwie hinzubasteln, bin aber auch sehr daran interessiert was mir die Experten hier als die eleganteste Lösung vorschlagen...
Vielen Dank schonmal vorweg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 195033
Url: https://administrator.de/contentid/195033
Ausgedruckt am: 26.11.2024 um 15:11 Uhr
1 Kommentar
Hallo XXXXBitter,
hier mein Vorschlag zur Lösung des Problems:
Aufruf:
Von den Parametern /r und /f kann nur einer angegeben werden. Wenn der Parameter /r angegeben wurde, wird ein evtl. gleichzeitig angegebener Parameter /f ignoriert.
Falls
Ich habe eine VBScript-Lösung gewählt, weil das Verarbeiten des Inhalts von Textdateien mit Batchscript regelmäßig fehlschlägt. Solche Textdateien enthalten oftmals Zeichen, die vom Batchinterpreter als Steuerzeichen interpretiert werden, was dazu führt, dass ein Batchscript mit Fehlermeldungen abbricht oder verstümmelte Ausgabedateien produziert.
Wenn Du Groß-/Kleinschreibung bei der Suche nach zu ersetzenden Wörtern ignorieren willst, lösche das Apostroph (Kommentarzeichen) am Anfang von Zeile 49 und setze am Anfang von Zeile 50 ein Apostroph oder lösche Zeile 50.
Gruß
Friemler
hier mein Vorschlag zur Lösung des Problems:
const ForReading = 1
const ForWriting = 2
const ForAppending = 8
Set colArgsNamed = WScript.Arguments.Named
Set colArgsUnnamed = WScript.Arguments.Unnamed
If colArgsNamed.Count >= 3 Then
If colArgsNamed.Exists("I") Then strInFile = colArgsNamed("I")
If colArgsNamed.Exists("P") Then strPattern = colArgsNamed("P")
If colArgsNamed.Exists("R") Then strReplacement = colArgsNamed("R")
If colArgsNamed.Exists("F") Then strReplacementFile = colArgsNamed("F")
If strInFile <> "" And strPattern <> "" And (strReplacement <> "" Or strReplacementFile <> "") Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strInFile) Then
If strReplacement = "" Then
If objFSO.FileExists(strReplacementFile) Then
Set objReplacementFile = objFSO.GetFile(strReplacementFile)
Set objInStream = objReplacementFile.OpenAsTextStream(ForReading)
strFileContent = objInStream.ReadAll
objInStream.Close
arrReplacements = Split(strFileContent, vbCrLf)
If arrReplacements(UBound(arrReplacements)) = "" Then
ReDim Preserve arrReplacements(UBound(arrReplacements) - 1)
End If
End If
Else
arrReplacements = Array(strReplacement)
End If
If Not IsEmpty(arrReplacements) Then
Set objInFile = objFSO.GetFile(strInFile)
Set objInStream = objInFile.OpenAsTextStream(ForReading)
strFileContent = objInStream.ReadAll
objInStream.Close
strInFilePath = objFSO.GetParentFolderName(strInFile)
strInFileName = objFSO.GetBaseName(strInFile)
strInFileExt = objFSO.GetExtensionName(strInFile)
intCntr = 1
For Each strReplacement In arrReplacements
'strNewFileContent = Replace(strFileContent, strPattern, strReplacement, 1, -1, vbTextCompare)
strNewFileContent = Replace(strFileContent, strPattern, strReplacement, 1, -1, vbBinaryCompare)
strOutFile = objFSO.BuildPath(strInFilePath, strInFileName + "_" + CStr(intCntr) + "." + strInFileExt)
Set objOutStream = objFSO.CreateTextFile(strOutFile, True)
objOutStream.Write strNewFileContent
objOutStream.Close
intCntr = intCntr + 1
Next
Else
WScript.Echo "Datei " + strReplacementFile + " nicht gefunden."
End If
Else
WScript.Echo "Datei " + strInFile + " nicht gefunden."
End If
Else
WScript.Echo "Fehlende Parameter"
End If
Else
WScript.Echo "Fehlende Parameter"
End If
Aufruf:
cscript /nologo <Scriptname>.vbs /i:<Eingabedatei> /p:<Suchwort> {/r:<Ersetzungswort> | /f:<Datei mit Ersetzungswörtern>
}Von den Parametern /r und /f kann nur einer angegeben werden. Wenn der Parameter /r angegeben wurde, wird ein evtl. gleichzeitig angegebener Parameter /f ignoriert.
Falls
Eingabedatei
, Suchwort
, Ersetzungswort
oder Datei mit Ersetzungswörtern
Leerzeichen enthält, muss das Element in Anführungszeichen eingeschlossen werden.Ich habe eine VBScript-Lösung gewählt, weil das Verarbeiten des Inhalts von Textdateien mit Batchscript regelmäßig fehlschlägt. Solche Textdateien enthalten oftmals Zeichen, die vom Batchinterpreter als Steuerzeichen interpretiert werden, was dazu führt, dass ein Batchscript mit Fehlermeldungen abbricht oder verstümmelte Ausgabedateien produziert.
Wenn Du Groß-/Kleinschreibung bei der Suche nach zu ersetzenden Wörtern ignorieren willst, lösche das Apostroph (Kommentarzeichen) am Anfang von Zeile 49 und setze am Anfang von Zeile 50 ein Apostroph oder lösche Zeile 50.
Gruß
Friemler