Ordnername und Vorgangsnummer aus Dateiname erstellen
Hallo,
ich habe je einen Ordner mit einer pdf-file und einen mit einer info-file ( *.xml )
D:\PDF
D:\XML
in der xml-file ist der Kunde und die Vorgangsnummer beinhaltet:
Zwei Beispiele; die natürlich im Ernstfall separat behandelt werden sollen .
437401-762-ZE-9-52-9.xml oder
02-419892-0-9743-KBR-2503-1-1.xml
437401 und 419892 ( kann auch die 02-419892 sein ) beziffern den Kunden.
die Ziffern vor "ZE" oder "KBR" beziffern den Vorgang.
Ziel:
Ordner anlegen mit der Vorgangsnummer
Hier also für das erste Beispiel in Verzeichnis D:\Speicher
D:\Speicher\762
Dann die xml und die pdf-file von D:\PDF und D:\XML in diesen Ordner verschieben
im nächsten Schritt soll der neu angelegte Ordner in ein Cloud -Verzeichnis verschoben werden - allerdings dem Kunden zugeordnet.
Hier also zu dem Kunden 437401 ( Müller) oder im nächsten Schritt zu ... 02-419892 ( Maier ) also in
C:\Users\Selbst\Nextcloud\Rechnungen\Mueller Rechnungen
oder
C:\Users\Selbst\Nextcloud\Rechnungen\Maier Rechnungen
Geht so etwas per Batch überhaupt ?
Dank im Voraus für jede Hilfe ))))
ich habe je einen Ordner mit einer pdf-file und einen mit einer info-file ( *.xml )
D:\PDF
D:\XML
in der xml-file ist der Kunde und die Vorgangsnummer beinhaltet:
Zwei Beispiele; die natürlich im Ernstfall separat behandelt werden sollen .
437401-762-ZE-9-52-9.xml oder
02-419892-0-9743-KBR-2503-1-1.xml
437401 und 419892 ( kann auch die 02-419892 sein ) beziffern den Kunden.
die Ziffern vor "ZE" oder "KBR" beziffern den Vorgang.
Ziel:
Ordner anlegen mit der Vorgangsnummer
Hier also für das erste Beispiel in Verzeichnis D:\Speicher
D:\Speicher\762
Dann die xml und die pdf-file von D:\PDF und D:\XML in diesen Ordner verschieben
im nächsten Schritt soll der neu angelegte Ordner in ein Cloud -Verzeichnis verschoben werden - allerdings dem Kunden zugeordnet.
Hier also zu dem Kunden 437401 ( Müller) oder im nächsten Schritt zu ... 02-419892 ( Maier ) also in
C:\Users\Selbst\Nextcloud\Rechnungen\Mueller Rechnungen
oder
C:\Users\Selbst\Nextcloud\Rechnungen\Maier Rechnungen
Geht so etwas per Batch überhaupt ?
Dank im Voraus für jede Hilfe ))))
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Kommentar vom Moderator tomolpi am 22.10.2020 um 13:18:06 Uhr
Kategorie geändert
Content-ID: 615192
Url: https://administrator.de/forum/ordnername-und-vorgangsnummer-aus-dateiname-erstellen-615192.html
Ausgedruckt am: 19.02.2025 um 22:02 Uhr
28 Kommentare
Neuester Kommentar
Nee. Du brauchst die Unterstützung von Regulären Ausdrücken. Damit, dass ein Regex Pattern in den Dateinamen verlässlich deine Kunden- und Vorgangsnummer finden kann, steht und fällt alles. (Ggf. ist es wesentlich einfacher den XML Inhalt zu parsen, falls sich diese Daten dort wiederfinden. Aber davon hast du nichts geschrieben.) Also solltest du das Pattern mal gegen alle möglichen infrage kommenden Dateinamen testen.
https://regex101.com/r/vhIeP3/1
Mit dem verlinkten Pattern gehe ich im Moment davon aus
PowerShell:
Soweit erst mal der Anfang bis zum Verschieben in D:\Speicher\...
Der Dateiname der ersten gefunden XML Datei wird verarbeitet, falls es mehrere geben sollte.
Die erste gefundene PDF Datei wird mit verschoben, falls es mehrere geben sollte. Der Dateiname wird dabei nicht berücksichtigt, da du nichts davon geschrieben hast dass der Dateiname der PDF Datei sich aus dem Dateiname der XML Datei ableiten lassen kann.
Weiter kann ich deinen Erklärungen aber nicht folgen.
Steffen
https://regex101.com/r/vhIeP3/1
Mit dem verlinkten Pattern gehe ich im Moment davon aus
- dass die Kundennummer mindesten 3-tellig ist und entweder direkt am Anfang des Dateinamens steht oder noch durch 2 Ziffern und - vorangestellt ist.
- dass der Vorgangsnummer entweder -ZE- oder -KBR- folgt.
PowerShell:
$xml_f = gci "D:\XML\*.xml" -file | select -f 1
$xml_f.name | sls -pattern "((^|^\d{2}-)\d{3,})-(\d+-)*(\d+)(?=-(ZE|KBR)-)" | %{$customer = $_.matches.groups[1].value; $case = $_.matches.groups[4].value}
# $("Vorgang: $case")
$case_d = $("D:\Speicher\$case")
ni $case_d -itemtype directory | out-null
$xml_f | mv -destination $case_d
gci "D:\PDF\*.pdf" -file | select -f 1 | mv -destination $case_d
# $("Kunde: $customer")
Der Dateiname der ersten gefunden XML Datei wird verarbeitet, falls es mehrere geben sollte.
Die erste gefundene PDF Datei wird mit verschoben, falls es mehrere geben sollte. Der Dateiname wird dabei nicht berücksichtigt, da du nichts davon geschrieben hast dass der Dateiname der PDF Datei sich aus dem Dateiname der XML Datei ableiten lassen kann.
Weiter kann ich deinen Erklärungen aber nicht folgen.
Hier also zu dem Kunden 437401 ( Müller) oder im nächsten Schritt zu ... 02-419892 ( Maier ) also in
C:\Users\Selbst\Nextcloud\Rechnungen\Mueller Rechnungen
oder
C:\Users\Selbst\Nextcloud\Rechnungen\Maier Rechnungen
Wo auch immer jetzt plötzlich die Namen Müller und Maier zu den Kundennummern herkommen sollen, erschließt sich mir nicht...C:\Users\Selbst\Nextcloud\Rechnungen\Mueller Rechnungen
oder
C:\Users\Selbst\Nextcloud\Rechnungen\Maier Rechnungen
Steffen
Hmm, also mit Batch würde ich das schlicht nicht umsetzen, da das Auseinandernehmen des Dateinamens ohne Regex einfach nicht sinnvoll ist.
Also hab ich weiterhin die PowerShell bemüht:
Habe entsprechende Kommentare eingefügt, damit du weißt was wo passiert. Pfade musst du anpassen. Die sind in deinem zweiten Post anders als im ersten und ich weiß nicht was davon der Realität entspricht. Der Code verarbeitet auch erst mal nur ein Dateipaar pro Lauf. Das lässt sich noch ändern. Ich würde aber gerne wissen, ob sich die Vorgangsnummer auch im PDF Dateiname wiederfindet, um etwas sicherer zu werden. Falls ja, gib mal ein konkretes Beispiel.
Die customers.csv, aus der ich lese, liegt im Scriptverzeichnis und hat den Aufbau
Also bspw. so
Also hab ich weiterhin die PowerShell bemüht:
# Lese Datei customers.csv
$customers = ipcsv ".\customers.csv" -delimiter ";" -header "number","name"
# Selektiere eine XML Datei
$xml_f = gci "D:\XML\*.xml" -file | select -f 1
# Extrahiere Kunden- und Vorgangsnummer aus dem Dateiname
$xml_f.name | sls -pattern "((^|^\d{2}-)\d{3,})-(\d+-)*(\d+)(?=-[A-Z]+-)" | %{$customernumber = $_.matches.groups[1].value; $case = $_.matches.groups[4].value}
# Finde den Kundenname anhand der Kundennummer in den CSV Daten
$customername = $customers | ?{$_.number -eq $customernumber} | select -ExpandProperty name
# Pfad mit Vorgangsnummer als String
$case_d = $("D:\Speicher\$case")
# Pfad mit Vorgangsnummer anlegen
ni $case_d -itemtype directory -force | out-null
# XML Datei verschieben
$xml_f | mv -destination $case_d
# PDF Datei anhand Kundenname finden und verschieben
gci ("D:\PDF\*RE_" + $customername + "*.pdf") -file | select -f 1 | mv -destination $case_d
# Nextcloud Pfad mit Kundenname als String
$cloud_d = ($env:USERPROFILE + "\Nextcloud\Rechnungen\" + $customername + " Rechnungen")
# Wenn Nextcloud Pfad mit Kundenname nicht existiert, dann anlegen
if(!(test-path $cloud_d)){
ni $cloud_d -itemtype directory | out-null
}
# Verzeichnis mit Vorgangsnummer in Nextcloud Pfad verschieben
mv $case_d $cloud_d
pause
Die customers.csv, aus der ich lese, liegt im Scriptverzeichnis und hat den Aufbau
Kundennummer;Kundenname
.Also bspw. so
437401;Mueller
02-419892;Maier
309001;Schulze
Bloß nicht den Sand ins Korn werfen oder gar die Flinte in den Kopf stecken 🤣
Microsoft übertreibts ein bisschen. Einerseits drängen sie uns (völlig zu Recht) dazu PowerShell zu nutzen, andererseits machen sie es den Usern nicht gerade leicht umzusteigen.
Das Script macht ja nun offensichtlich keine böswilligen Dinge. Also bauen wir uns ein Workaround. Leg mal diesen Einzeiler als Batch neben dein PowerShell Script und führe es aus:
Wenn du irgendwann das Execution Policy Problem gelöst hast, vergiss die ISE. Die ist von Vorgestern. Rechtsklick und "Mit PowerShell ausführen" reicht in der Regel, wenn die Fehler ausgebügelt sind.
Steffen
Microsoft übertreibts ein bisschen. Einerseits drängen sie uns (völlig zu Recht) dazu PowerShell zu nutzen, andererseits machen sie es den Usern nicht gerade leicht umzusteigen.
Das Script macht ja nun offensichtlich keine böswilligen Dinge. Also bauen wir uns ein Workaround. Leg mal diesen Einzeiler als Batch neben dein PowerShell Script und führe es aus:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "& '.\Test1.ps1'"
Steffen
PS C:\Users\Martin> C:\Users\Martin\Desktop\Test1.ps1
Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "file" entspricht.
Nanu? Keine XML Datei im Verzeichnis gewesen?Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "file" entspricht.
Die Benennung "sls" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausf
ührbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (so
fern enthalten), und wiederholen Sie den Vorgang.
Hmm. Deine PowerShell Version scheint ziemlich alt zu sein. Ersetze ührbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (so
fern enthalten), und wiederholen Sie den Vorgang.
sls
mal durch Select-String
Rest sollten Folgefehler sein.
Steffen
PS: Versuch mal bitte Code formatiert zu posten, sonst macht die Forensoftware komische Dinge daraus. (
</>
Piktogramm links im Editorfenster)
Immer mit der Ruhe ...
# Lese Datei customers.csv
$customers = ipcsv "C:\Users\Martin\customers.csv" -delimiter ";" -header "number","name"
# Selektiere eine XML Datei
$xml_f = gci "C:\SCtech\Burodent\ElRech\*.xml" | select -f 1
# Extrahiere Kunden- und Vorgangsnummer aus dem Dateiname
$xml_f.name -match "((^|^\d{2}-)\d{3,})-(\d+-)*(\d+)(?=-[A-Z]+-)" | out-null
$customernumber = $Matches[1]
$case = $Matches[4]
# Finde den Kundenname anhand der Kundennummer in den CSV Daten
$customername = $customers | ?{$_.number -eq $customernumber} | select -ExpandProperty name
# Pfad mit Vorgangsnummer als String
$case_d = $("C:\SCtech\Burodent\ElRech\$case")
# Pfad mit Vorgangsnummer anlegen
ni $case_d -itemtype directory -force | out-null
# XML Datei verschieben
$xml_f | mv -destination $case_d
# PDF Datei anhand Kundenname finden und verschieben
gci ("C:\SCtech\Burodent\PDF\*RE_" + $customername + "*.pdf") | select -f 1 | mv -destination $case_d
# Nextcloud Pfad mit Kundenname als String
$cloud_d = ($env:USERPROFILE + "\Nextcloud\Rechnungen\" + $customername + " Rechnungen")
# Wenn Nextcloud Pfad mit Kundenname nicht existiert, dann anlegen
if(!(test-path $cloud_d)){
ni $cloud_d -itemtype directory | out-null
}
# Verzeichnis mit Vorgangsnummer in Nextcloud Pfad verschieben
mv $case_d $cloud_d
# pause gibt's nicht in PS v2 aber du führst ja sowieso in der ISE aus...
# pause
Die Datei customers.csv steht im Verzeichnis C:\Users\Martin
Hab ich jetzt so geändert. Hattest du eben noch direkt auf C: und lag auch schon mal auf deinem Desktop. Prüf noch mal was nun richtig ist.
Hilf noch mal
ZE oder KBR oder ... Was noch?
Neues Pattern erst mal
Einfach per | mit in die Gruppe packen und dort testen:
https://regex101.com/r/vhIeP3/2
LogMonitor muss ich mir erst ansehen. Natürlich lässt sich das ausführen. Siehe meinen Batch Einzeiler. Du müsstest nur den kompletten Pfad zum Script in die Kommandozeile für LogMonitor schreiben à la
Zusätzliche Batchdatei brauchst du dann wohl nicht.
ZE oder KBR oder ... Was noch?
Neues Pattern erst mal
"((^|^\d{2}-)\d{3,})-(\d+-)*(\w+)(?=-(ZE|KBR)-)"
Einfach per | mit in die Gruppe packen und dort testen:
https://regex101.com/r/vhIeP3/2
LogMonitor muss ich mir erst ansehen. Natürlich lässt sich das ausführen. Siehe meinen Batch Einzeiler. Du müsstest nur den kompletten Pfad zum Script in die Kommandozeile für LogMonitor schreiben à la
C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\Users\Martin\Desktop\Test1.ps1'"