Jump to content

XML nach Teil des Dateinamens in VBS bearbeiten


Go to solution Solved by NilsK,

Recommended Posts

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 to post
  • Solution

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

 

  • Like 2
Link to post
vor 44 Minuten schrieb NilsK:

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


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

 

Vielen Dank Nils,

 

Das hat einwandfrei funktioniert.

 

Vielen Lieben Dank 

 

Grüße, Andreas

Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...