Jump to content

XML nach Teil des Dateinamens in VBS bearbeiten


Direkt zur Lösung Gelöst von NilsK,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo Zusammen,

 

Ich habe mir ein VB-Script aus mehreren Schnippseln zusammen gebastelt das soweit auch ohne Probleme funktioniert.

 

Nun habe ich in dem Ordner wo die betreffenden XML-Dateien liegen auch andere Auch andere XML-Dateien die nicht bearbeitet werden sollen.

 

Wie kann ich es bewerkstelligen das nur XML-Dateien bearbeitet werden die einen bestimmten Text im Dateinamen haben?

 

Die Dateien sind immer so benannt:

 

7542_PAUFTRAG.XML

7542_PM.XML

7542_PM_HISTORIE.XML

7542_PM_HISTORIE_DOKUMENTE.XML

 

Die Zahl vor dem Unterstrich ist eine Fortlaufende Nummer die beim erstellen der Datei automatisch generiert wird.

 

In meinem VB-Script möchte ich nur Dateien bearbeiten die mit _PM.XML enden (Also diese Dateien wie die zweite in der Auflistung oben).

 

Das Script selbst wird über einen Batch aufgerufen.

 

If WScript.Arguments.Count < 1 Then
  WScript.Echo "Syntax:" & _
    vbLf & """" & WScript.ScriptName & """ ""Pfad"" [""FixerWert""]" & _
    vbLf & vbLF & "Returncodes:" & _
    vbLf & "3  zu wenig Argumente" & _
    vbLf & "2  Verzeichnis nicht gefunden" & _
    vbLf & "1  eine oder Mehrere Dateien konnten nicht verarbeitet werden" & _
    vbLf & "0  alle gefundenen Dateien erfolgreich verarbeitet" & vbLf
  WScript.Quit 3
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
strSrcDir = objFSO.GetAbsolutePathName(WScript.Arguments(0))
If Not objFSO.FolderExists(strSrcDir) Then WScript.Quit 2

strLogPath = objFSO.GetParentFolderName(WScript.ScriptFullName)
strLogName = objFSO.GetBaseName(WScript.ScriptName) & " " & _
             Year(Now) & "-" & Right("0" & Month(Now), 2) & "-" & Right("0" & Day(Now), 2) & " " & _
             Right("0" & Hour(Now), 2) & "-" & Right("0" & Minute(Now), 2) & "-" & Right("0" & Second(Now), 2) & _
             ".log"

Set objLogFile = objFSO.CreateTextFile(objFSO.BuildPath(strLogPath, strLogName), True)

iSucc = 0
iErr = 0

For Each objFile In objFSO.GetFolder(strSrcDir).Files
  If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then
    iRet = Process_XML(objFile.Path)
    If iRet > 0 Then
      objLogFile.WriteLine """" & objFile.Name & """ - " & iRet & " Knoten verarbeitet."
      iSucc = iSucc + 1
    Else
      objLogFile.WriteLine """" & objFile.Name & """ - Verarbeitung fehlgeschlagen."
      iErr = iErr + 1
    End If
  End If
Next

objLogFile.Close

strMessage = iSucc + iErr & " Dateien verarbeitet." & _
  vbLf & iSucc & " erfolreich" & _
  vbLf & iErr & " fehlgeschlagen" & _
  vbLf & _
  vbLf & "Möchten Sie sich die Log-Datei anschauen?"

If iErr = 0 Then
  cButtons = vbQuestion
Else
  cButtons = vbCritical
End If

If MsgBox(strMessage, cButtons + vbYesNo, WScript.ScriptName) = vbYes Then
  Set objShell = CreateObject("WScript.Shell")
  objShell.Run "notepad.exe """ & objFSO.BuildPath(strLogPath, strLogName) & """"
End If

If iErr > 0 Then WScript.Quit 1

Function Process_XML(ByRef strXmlDoc)

	Dim objxmlDoc, objNodes, objNodes1, xmlNode, xmlNode1

    Set objXmlDoc = CreateObject("Microsoft.XMLDOM")
	objXmlDoc.async = False
	objXmlDoc.load(strXmlDoc)
    iCounter = 0

Set parentNode = objXmlDoc.documentElement.SelectSingleNode("//KOSTEN")
Set objNodes = objXmlDoc.documentElement.SelectNodes("//KOSTEN/KOST_BETRAG")
Set objNodes1 = objXmlDoc.documentElement.SelectNodes("//KOSTEN/KOST_BASIS")

IF ParentNode Is Nothing Then
  MsgBox "Der Knoten ""KOSTEN"" wurde nicht gefunden!", vbCritical, "Fehler"
  iCounter = iCounter + 0
Else

For Each xmlNode in objNodes
xmlNode.text = ""
iCounter = iCounter + 1
Next

For Each xmlNode1 in objNodes1
xmlNode1.text = ""
iCounter = iCounter + 1
Next

End If

If iCounter > 0 Then objXmlDoc.save(strXmlDoc)

objXmlDoc.save(strXmlDoc)
Set objXmlDoc = Nothing

Process_XML = iCounter

End Function

 

Würde mich sehr über Anregungen und Lösungen freuen.

 

Vielen Dank.

Link zu diesem Kommentar
  • Beste Lösung

Moin,

 

ui, sowas heute noch in VBS zu machen ... ich sage mal voraus, dass dir hier einige zur PowerShell raten werden.

 

Ich hab's nicht mehr genau im Kopf, aber es kann sein, dass das FileSystemObject keine Filter bei der Dateiauswahl kennt. Du müsstest das also selbst prüfen. Dazu hast du ja auch schon eine Zeile in deinem Code:

If LCase(objFSO.GetExtensionName(objFile.Name)) = "xml" Then

Hier könntest du die Bedingung mit AND um deine zweite Vorgabe zum Dateinamen ergänzen, vermutlich mit

Instr(objFile.Name, "deine-Zeichenkette") > 0

 

Ist ungeprüft, versuch damit mal rum.

 

Puh, VBS war schon gruselig. :lol3:

 

Gruß, Nils

 

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...