xxxxbitter
Goto Top

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

Content-Key: 195033

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

Printed on: April 26, 2024 at 10:04 o'clock

Member: Friemler
Friemler Nov 28, 2012, updated at Nov 29, 2012 at 09:56:05 (UTC)
Goto Top
Hallo XXXXBitter,

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