Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Batch XML Importer - Import von Dateien mittels Batch und xml-File

Frage Entwicklung Batch & Shell

Mitglied: DeeJayBee

DeeJayBee (Level 1) - Jetzt verbinden

24.06.2014 um 14:37 Uhr, 1551 Aufrufe, 7 Kommentare

Hallo zusammen,

ich habe gerade folgendes Problem:

Ein Scanner scannt Dokumente in ein Verzeichnis C:\scans\auftraege
Er benennt jedes Dokument fortlaufend Dok_001.tif
Dazu gibts jeweils eine xml-Datei Dok_001.xml, die soetwas hier enthält:

01.
<?xml version="1.0" encoding="utf-16"?> 
02.
<ScanIndex ScanProfilName="Auftrag erfassen" FileName="Dok_001.tif" Seitengescant="2" Seitengeloescht="1" Seitengespeichert="1"> 
03.
    <ImagePropertys Path="C:\scans\auftraege" /> 
04.
    <FieldsInfo> 
05.
        <feld_1 Feldtyp="Auswahl" Feldname="Jahr" Feldlaenge="4" Wert="2014" /> 
06.
        <feld_2 Feldtyp="Text" Feldname="Auftrags-Nr." Feldlaenge="20" Wert="44545" /> 
07.
    </FieldsInfo> 
08.
</ScanIndex>
Ich möchte folgendes tun:

Ein Batchscript, welches den Ordner C:\scans\auftraege durchsucht nach xml-Dateien.
Aus diesen xml-Dateien das zugehörige Dokument ( FileName="Dok_001.tif" ) anfasst und verschiebt.
Zielpfad soll sein: w:\auftraege\ %jahr% \ %auftragsnummer% \ Dok_001_%auftragsnummer%.tif

Das Quell xml und tif Dokument soll nach Verarbeitung aus dem Ordner scans entfernt werden.

Theoretisch eigentlich nicht schwer, nur steh ich da irgendwie aufm Schlauch.

Könnt ihr mir helfen?

Schöne Grüße
Daniel





Nachtrag:
Seitengescant="2" Seitengeloescht="1" Seitengespeichert="1"
Der Scanner kann leere Seiten entfernen, bzw auch mehrere Dateien einzeln ablegen, so dass eine xml-Datei für mehrere tifs verfügbar ist.
Das Ergebnis wären Dok_001_001 - Dok_001_%seitenanzahl%
Indikator für mehrere tif Dokumente zu einer xml ist der Parameter %seitengespeichert%
Ich werd den Scanner allerdings so einstellen, dass er zu jeder xml auch nur 1 tif-Dokument hat. Aber falls jemand auch für diesen Teil eine Lösung hat, ich wäre nicht böse.
Mitglied: Friemler
LÖSUNG 24.06.2014, aktualisiert 27.06.2014
Hallo Daniel,

da Deine XML-Datei laut Header in UTF-16 kodiert ist, eignet sich Batchscript nicht zum Parsen der Datei. MS stellt für solche Zwecke aber glücklicherweise eine ActiveX-Komponente bereit, die sich von VB Script aus nutzen lässt. Die Arbeit damit ist außerdem viel bequemer. Deshalb hier mein Vorschlag in VB Script:

01.
Option Explicit 
02.
 
03.
 
04.
'Konfiguration 
05.
Const strSourceFolder = "C:\Scans\Auftraege" 
06.
Const strDestFolder   = "W:\Auftraege" 
07.
 
08.
 
09.
'Deklaration der globalen Variablen 
10.
Dim objFSO, objXMLDoc, objFile 
11.
Dim strFilePath, strFileName, strPageCount, strJobNum, strYear 
12.
 
13.
 
14.
'Objekte erzeugen 
15.
Set objFSO    = CreateObject("Scripting.FileSystemObject") 
16.
Set objXMLDoc = CreateObject("MSXML2.DOMDocument.6.0") 
17.
 
18.
 
19.
'Hauptprogramm 
20.
For Each objFile In objFSO.GetFolder(strSourceFolder).Files 
21.
  If StrComp(objFSO.GetExtensionName(objFile.Path), "xml", vbTextCompare) = 0 Then 
22.
    If LoadXMLFile(objFile.Path) Then 
23.
      Call ParseXMLFile 
24.
      If ProcessTask Then Call DeleteFile(objFile.Path) 
25.
    Else 
26.
      WScript.Echo "Fehler beim Laden der Datei" & vbCrLf & _ 
27.
                   objFile.Path & vbCrLf & _ 
28.
                   objXMLDoc.parseError.reason 
29.
    End If 
30.
  End If 
31.
Next 
32.
 
33.
 
34.
 
35.
'******************** Unterprogramme ******************* 
36.
 
37.
Function LoadXMLFile(strFilePath) 
38.
  objXMLDoc.async            = False 
39.
  objXMLDoc.validateOnParse  = False 
40.
  objXMLDoc.resolveExternals = False 
41.
 
42.
  Call objXMLDoc.load(strFilePath) 
43.
 
44.
  LoadXMLFile = (objXMLDoc.parseError.errorCode = 0) 
45.
End Function 
46.
 
47.
 
48.
Sub ParseXMLFile 
49.
  Dim objScanIndex, objImgProps, objFieldsInfo, objFieldInfo 
50.
  Dim strFieldName 
51.
   
52.
  'XML-Knoten ScanIndex einlesen und Attribute auswerten 
53.
  Set objScanIndex  = objXMLDoc.documentElement.selectSingleNode("//ScanIndex") 
54.
  strFileName       = objScanIndex.getAttribute("FileName") 
55.
  strPageCount      = objScanIndex.getAttribute("Seitengespeichert") 
56.
                     
57.
  'XML-Knoten ImagePropertys einlesen und Attribute auswerten 
58.
  Set objImgProps   = objXMLDoc.documentElement.selectSingleNode("//ImagePropertys") 
59.
  strFilePath       = objImgProps.getAttribute("Path") 
60.
 
61.
  'XML-Knoten FieldsInfo einlesen... 
62.
  Set objFieldsInfo = objXMLDoc.documentElement.selectSingleNode("//FieldsInfo") 
63.
 
64.
  '...und Attribute auswerten 
65.
  For Each objFieldInfo In objFieldsInfo.childNodes 
66.
    strFieldName = objFieldInfo.getAttribute("Feldname") 
67.
     
68.
    If     strFieldName = "Jahr" Then 
69.
      strYear   = objFieldInfo.getAttribute("Wert") 
70.
    ElseIf strFieldName = "Auftrags-Nr." Then 
71.
      strJobNum = objFieldInfo.getAttribute("Wert") 
72.
    End If 
73.
  Next 
74.
End Sub 
75.
 
76.
 
77.
Function ProcessTask 
78.
  On Error Resume Next 
79.
   
80.
  Dim intCnt, intFileCnt 
81.
  Dim strSrcFileName, strSrcFilePath, strDstFileName, strDstFilePath 
82.
  Dim arrFiles 
83.
   
84.
  intFileCnt = CInt(strPageCount) 
85.
  arrFiles   = Array() 
86.
   
87.
  For intCnt = 1 To intFileCnt 
88.
    If intFileCnt = 1 Then 
89.
      strSrcFilePath = objFSO.BuildPath(strFilePath, strFileName) 
90.
      strDstFileName = objFSO.GetBaseName(strFileName) & "_" & strJobNum & "." & objFSO.GetExtensionName(strFileName) 
91.
      strDstFilePath = objFSO.BuildPath(strDestFolder, strYear & "\" & strJobNum & "\" & strDstFileName) 
92.
    Else 
93.
      strSrcFileName = objFSO.GetBaseName(strFileName) & "_" & Right("00" & CStr(intCnt), 3) & "." & objFSO.GetExtensionName(strFileName) 
94.
      strSrcFilePath = objFSO.BuildPath(strFilePath, strSrcFileName) 
95.
      strDstFileName = objFSO.GetBaseName(strSrcFileName) & "_" & strJobNum & "." & objFSO.GetExtensionName(strSrcFileName) 
96.
      strDstFilePath = objFSO.BuildPath(strDestFolder, strYear & "\" & strJobNum & "\" & strDstFileName) 
97.
    End If 
98.
     
99.
    ProcessTask = CopyFile(strSrcFilePath, strDstFilePath) 
100.
    If Not ProcessTask Then Exit For 
101.
     
102.
    ReDim Preserve arrFiles(UBound(arrFiles) + 1) 
103.
    arrFiles(UBound(arrFiles)) = strSrcFilePath 
104.
  Next 
105.
   
106.
  If ProcessTask Then Call DeleteImageFiles(arrFiles) 
107.
End Function 
108.
 
109.
 
110.
Function CopyFile(strSrcFilePath, strDstFilePath) 
111.
  On Error Resume Next 
112.
   
113.
  Dim objShell, strDstPath 
114.
   
115.
  strDstPath = objFSO.GetParentFolderName(strDstFilePath) 
116.
   
117.
  If Not objFSO.FolderExists(strDstPath) Then 
118.
    Set objShell = CreateObject("WScript.Shell") 
119.
    Call objShell.Run("cmd /c mkdir """ & strDstPath & """", 0, True) 
120.
  End If 
121.
   
122.
  Call objFSO.CopyFile(strSrcFilePath, strDstFilePath, False) 
123.
  CopyFile = (Err.Number = 0) 
124.
 
125.
  Call TestError("Fehler beim Kopieren der Datei", strSrcFilePath) 
126.
End Function 
127.
 
128.
 
129.
Sub DeleteImageFiles(ByRef arrFiles) 
130.
  On Error Resume Next 
131.
   
132.
  Dim intCnt 
133.
   
134.
  For intCnt = 0 To UBound(arrFiles) 
135.
    Call DeleteFile(arrFiles(intCnt)) 
136.
  Next 
137.
End Sub 
138.
 
139.
 
140.
Sub DeleteFile(strFilePath) 
141.
  On Error Resume Next 
142.
   
143.
  Call objFSO.DeleteFile(strFilePath, True) 
144.
  Call TestError("Fehler beim Löschen der Datei", strFilePath) 
145.
End Sub 
146.
 
147.
 
148.
Sub TestError(strMessage, strFilePath) 
149.
  If Err.Number <> 0 Then 
150.
    WScript.Echo strMessage & vbCrLf & _ 
151.
                 strFilePath & vbCrLf & _ 
152.
                 Err.Description 
153.
    Err.Clear 
154.
  End If 
155.
End Sub
Den Code in eine Textdatei mit der Dateierweiterung vbs speichern. Du kannst das Script dann per Doppelklick starten.

Die Zeilen 5 und 6 musst Du ggf. anpassen. Falls sich die Namen der Knoten in der XML-Datei ändern bzw. mit Deinen Angaben nicht übereinstimmen, musst Du die entsprechenden Stellen im Unterprogramm ParseXMLFile ändern.

Gruß
Friemler
Bitte warten ..
Mitglied: DeeJayBee
25.06.2014 um 09:44 Uhr
Hallo Friemler,

vielen Dank schon einmal!
Das ist doch etwas umfangreicher, als ich erwartet habe...

Mein erster Test wirft einen Kompilierungsfehler:

Zeile 93, Zeichen 52
Beim Aufrufen einer Unterroutine (Sub) dürfen keine Klammern verwendet werden.

Eigentlich sieht dieser Aufruf für mich okay aus...
Da meine VB-Kenntnisse noch bescheidener sind als mit Batch komm ich hier nicht weiter...


Gruß
Daniel
Bitte warten ..
Mitglied: colinardo
LÖSUNG 25.06.2014, aktualisiert 27.06.2014
Hallo Daniel,
Beim Aufrufen einer Unterroutine (Sub) dürfen keine Klammern verwendet werden.
schreib es so:
objFSO.MoveFile strSrcFilePath, strDstFilePath
Grüße Uwe

p.s. eine alternative Lösung mit Powershell könnte so aussehen (Funktioniert ebenfalls für beide Varianten mit einer oder mehreren Files):
01.
#------------------------------------------ 
02.
$sourcePath ="C:\scans\auftraege"  
03.
$targetPath = "w:\auftraege" 
04.
# ----------------------------------------- 
05.
$xml = new-object XML 
06.
$files = dir "$sourcePath\*.xml" 
07.
foreach($file in $files){ 
08.
    # XML-File laden 
09.
    $xml.Load($file.FullName) 
10.
     
11.
    # Infos extrahieren 
12.
    $strFName = $xml.ScanIndex.FileName 
13.
    $strYear = $xml.ScanIndex.FieldsInfo.SelectSingleNode("*[@Feldname='Jahr']").Wert 
14.
    $strJobNr = $xml.ScanIndex.FieldsInfo.SelectSingleNode("*[@Feldname='Auftrags-Nr.']").Wert 
15.
     
16.
    # Zielordner festlegen und erzeugen 
17.
    $newFolder = "$targetPath\$strYear\$strJobNr" 
18.
    if(!(Test-Path $newFolder)){md $newFolder -Force | out-null} 
19.
 
20.
    # Files verschieben 
21.
    $finfo = [System.IO.FileInfo]"$strFName" 
22.
    dir "$sourcePath\$($finfo.BaseName)*$($finfo.Extension)" | %{move-item $_.FullName "$newFolder\$($_.BaseName)_$strJobNr$($_.Extension)"} 
23.
     
24.
    # XML File löschen 
25.
    del $file.FullName -Force 
26.
}
Bitte warten ..
Mitglied: Friemler
25.06.2014 um 11:43 Uhr
Hallo Daniel,

sorry, man sollte seinen Code doch immer VOLLSTÄNDIG testen...

Ich habe das Script oben korrigiert.

Gruß
Friemler
Bitte warten ..
Mitglied: DeeJayBee
26.06.2014, aktualisiert um 12:02 Uhr
Hallo ihr beiden!

Respekt erstmal, das sieht beides super aus.

@colinardo : Kannst Du mir noch sagen, wie ich das Script zum laufen bekomme?
Da Dein Script kürzer ist, sieht es übersichtlicher aus. Das würde ich auch gerne testen.
Ich weiß nur nicht, wie man Powershell am Rechner einrichtet / einrichten muss. Habe bislang nur Batch Erfahrung.

@Friemler : Das vb-Script läuft einwandfrei, ich habe noch einen kleinen Zähler mit eingebaut, der mir die Anzahl der Durchläufe anzeigt

Grüße
Daniel
Bitte warten ..
Mitglied: colinardo
26.06.2014, aktualisiert 27.06.2014
Zitat von DeeJayBee:
@colinardo : Kannst Du mir noch sagen, wie ich das Script zum laufen bekomme?
Anleitung: Wie starte ich Powershell-Scripte
  • Zuerst speicherst man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script in der Konsole mit Eingabe des Pfades der Scriptdatei, oder mit einem Rechtsklick auf die Script-Datei :Mit Powershell ausführen gestartet werden.
Bitte warten ..
Mitglied: DeeJayBee
27.06.2014 um 09:52 Uhr
Perfekt!

Vielen Dank
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Powershellscript zum konvertieren und anpassen einer XML für Elster Import
gelöst Frage von ShaijanBatch & Shell9 Kommentare

Guten Morgen Zusammen, Ich habe nun mehrere Tage damit verschwendet ein vielleicht recht simples Script zu schreiben was nicht ...

Batch & Shell
BATCH Element aus XML-File auslesen
gelöst Frage von pappkameradBatch & Shell9 Kommentare

Hallo liebe Admins, ich habe schon öfter bei euch vorbeigeschaut und ein immer eine Lösung für meine Problemchen gefunden. ...

Microsoft Office
HTML File import in Excel Zelle
gelöst Frage von lupitaMicrosoft Office14 Kommentare

Hallo zusammen Gibt es eine Möglichkeit auf einem HTML File den Code in eine einzelne Zelle zu füllen. Wenn ...

Batch & Shell
Reg-File import via PS1
gelöst Frage von EmptymanBatch & Shell6 Kommentare

Hallo zusammen, ich benötige (wieder) einmal eure Hilfe. :-) Es liegt ein Reg-File auf einem Netzwerkpfad welche öfter geändert ...

Neue Wissensbeiträge
Apple

IOS 11.2.1 stopft HomeKit-Remote-Lücke

Tipp von BassFishFox vor 20 StundenApple

Das Update für iPhone, iPad und Apple TV soll die Fernsteuerung von Smart-Home-Geräten wieder in vollem Umfang ermöglichen. Apple ...

Windows 10

Windows 10 v1709 EN murkst bei den Regionseinstellungen

Tipp von DerWoWusste vor 1 TagWindows 10

Dieser kurze Tipp richtet sich an den kleinen Personenkreis, der Win10 v1709 EN-US frisch installiert und dabei die englische ...

Webbrowser

Kein Ton bei Firefox Quantum über RDP

Tipp von Moddry vor 1 TagWebbrowser

Hallo Kollegen! Hatte das Problem, dass der neue Firefox bei mir auf der Kiste keinen Ton hat, wenn ich ...

Internet

EU-DSGVO: WHOIS soll weniger Informationen liefern

Information von sabines vor 1 TagInternet4 Kommentare

Wegen der europäische Datenschutzgrundverordnung stehen die Prozesse um die Registrierung von Domains auf dem Prüfstand. Sollte die Forderungen umgesetzt ...

Heiß diskutierte Inhalte
Windows Server
RODC kann nicht aus Domäne entfernt werden
Frage von NilsvLehnWindows Server18 Kommentare

HAllo, ich arbeite in einem Universitätsnetzwerk mit 3 Standorten. Die Standorte haben alle ein ESXi Cluster und auf diesen ...

Hardware
Links klick bei Maus funktioniert nicht
gelöst Frage von Pablu23Hardware16 Kommentare

Hallo erstmal. Ich habe ein Problem mit meiner relativ alten maus jedoch denke ich nicht das es an der ...

Netzwerkmanagement
Mehrere Netzwerkadapter in einem PC zu einem Switch zusammenfügen
Frage von prodriveNetzwerkmanagement16 Kommentare

Hallo zusammen Vorweg, ich konnte schon einige IT-Probleme mit Hilfe dieses Forums lösen. Wirklich klasse hier! Doch für das ...

Windows XP
Windows XP Aktivieren geht nicht
Frage von tetikmiroWindows XP13 Kommentare

Hallo Ich habe einen Windows XP mit einen vCenter Converter umgezogen auf eine ESXI. Soweit funktioniert dies auch ohne ...