Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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, 1476 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 ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
gelöst BATCH Element aus XML-File auslesen (9)

Frage von pappkamerad zum Thema Batch & Shell ...

Batch & Shell
gelöst XML-Datei: Pfade suchen, verlinkte Dateien kopieren und Pfade ändern (4)

Frage von ELEVATOR zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...