mmarkuss
Goto Top

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 ))))
Kommentar vom Moderator tomolpi am Oct 22, 2020 um 11:18:06 Uhr
Kategorie geändert

Content-Key: 615192

Url: https://administrator.de/contentid/615192

Printed on: April 19, 2024 at 09:04 o'clock

Member: rubberman
Solution rubberman Oct 24, 2020 updated at 11:14:41 (UTC)
Goto Top
Zitat von @MmarKuss:
Geht so etwas per Batch überhaupt ?
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
  • 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.
Sollte es davon Ausnahmen geben, dann musst du das Pattern so anpassen, dass Kundennummer und Vorgangsnummer immer in jeweils derselben Gruppe gematcht werden.
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") 
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.
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...

Steffen
Member: MmarKuss
MmarKuss Oct 26, 2020 at 07:56:46 (UTC)
Goto Top
Hallo rubberman,

erst mal vielen Dank für Deine Mühe.

Als purer Autodidakt muss ich aber zugeben, daß mich Dein Skript "dezent" überfordert....)))
(...nur zur Erklärung 437401 it immer Mueller ect, das wird von mir so definiert - hier natürlich Spielnamen ...Datenschutz ....)

Ich habe mich aber bereits selbst ein bisschen durchgewurschtelt

@echo off ...


for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\ElRech\*437401*.*') do (
xcopy /Y "%%f" C:\ElRech\Mueller\ /S
)
for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\PDF\*RE_Muell*.*') do (
xcopy /Y "%%f" C:\Elrech\Mueller\ /S
)

for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\ElRech\*02-4198*.*') do (
xcopy /Y "%%f" C:\ElRech\Maier\ /S
)
for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\PDF\*RE_Maie*.*') do (
xcopy /Y "%%f" C:\Elrech\Maier\ /S
)

for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\ElRech\*309001*.*') do (
xcopy /Y "%%f" C:\ElRech\Schulze\ /S
)
for /F "tokens=*" %%f in ('dir /S /b C:\Speicher\PDF\*RE_Schul*.*') do (
xcopy /Y "%%f" C:\Elrech\Schulze\ /S
)


del C:\Speicher\ElRech\*.* /s/q
del C:\Speicher\PDF\*.* /s/q

xcopy C:\ElRech\Mueller\*.* "C:\Users\Selbst\Nextcloud\Rechnungen\Mueller Rechnungen"
xcopy C:\ElRech\Schulze\*.* "C:\Users\Selbst\Nextcloud\Rechnungen\Schulze Rechnungen"
xcopy C:\ElRech\Maier\*.* "C:\Users\Selbst\Nextcloud\Rechnungen\Maier Rechnungen"

del C:\ElRech\Mueller\*.* /s/q
del C:\ElRech\Schulze\*.* /s/q
del C:\ElRech\Maier\*.* /s/q

exit

Jetzt habe ich prinzipiell alles dort, wo ich es haben wollte, allerdings irgendwann zig xml´s und pdf in der Datei und es wird unüberstichtlich, welche xml zu welcher pdf gehört.

Mit dem Folgenden bekomme ich auch einen gewünschten Unterordner . Da sich der Name dieses Unterordners aber in Abhängigkeit der Vorgangsnummer immer ändert,
beiße ich mich noch daran fest, wie ich sowohl die aktuelle xml, als auch die aktuelle pdf dort reinbekomme, damit der Kunde immer alles passend zusammen hat.


@echo off & setlocal ENABLEDELAYEDEXPANSION
set "folder=C:\Speicher\ElRech"
set markers=ZE KBR XXX
for %%a in ("%folder%\*.xml") do (
set "name=%%~na"
for %%b in (%markers%) do set "name=!name:-%%b=#!"
for /f "tokens=1 delims=#" %%b in ("!name!") do (set "part=%%b" & set "num=!part:~-5!")
if not exist "%folder%\!num!" md "%folder%\!num!" >nul
echo Moving '%%a' to '%folder%\!num!' ...
move "%%a" "%folder%\!num!"
echo Moving '*.pdf' to '%folder%\!num!' ...
move "*.pdf" "%folder%\!num!"
)

Wenn Du mir dafür noch einen ( für Doofe nachvollziehbaren ))) ...) Tip hast, wäre super.
Member: rubberman
rubberman Oct 26, 2020 at 20:35:08 (UTC)
Goto Top
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:
# 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
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 Kundennummer;Kundenname.
Also bspw. so
437401;Mueller
02-419892;Maier
309001;Schulze
Member: MmarKuss
MmarKuss Oct 27, 2020 at 13:01:26 (UTC)
Goto Top
Hallo Steffen,

hab erst mal ´ne ganze Weile gebraucht, um heraus zu finden, wie ich eine ps1 starte...
Ich habe dir mal den Anfang reinkopiert mit den echten Pfaden. Da kommt aber dann sofort eine Fehlermeldung ....
Mit Null Ahnung von Powershell stehe ich jetzt da, wie ein dummer Junge ...)))

  1. Lese Datei customers.csv
$customers = ipcsv C:\Users\Martin\Desktop\customers.csv" -delimiter ";" -header "number","name"
  1. Selektiere eine XML Datei
$xml_f = gci "C:\SCtech\Burodent\ElRech\*.xml" -file | select -f 1
  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}
  1. Finde den Kundenname anhand der Kundennummer in den CSV Daten
$customername = $customers | ?{$_.number -eq $customernumber} | select -ExpandProperty name
  1. Pfad mit Vorgangsnummer als String
$case_d = $("C:\SCtech\Burodent\ElRech\$case")


Powershellmeldung 2. Fenster:

PS C:\Users\Martin> C:\Users\Martin\Desktop\Test1.ps1
Der Zeichenfolge, beginnend mit:
Bei C:\Users\Martin\Desktop\Test1.ps1:26 Zeichen:19

back-to-topRead-Host -Prompt <<<< "Bitte eine beliebige Taste zum Beenden drücken ...

fehlt der Terminator: ".
Bei C:\Users\Martin\Desktop\Test1.ps1:26 Zeichen:70

back-to-topRead-Host -Prompt "Bitte eine beliebige Taste zum Beenden drücken ... <<<<

+ CategoryInfo : ParserError: (Bitte eine beli...den drücken ...:String) ,
ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString


Powershellmeldung 3.Fenster :
PS C:\Users\Martin> C:\Users\Martin\Desktop\Test1.ps1
Unerwartetes Token "number","name"
  1. Selektiere eine XML Datei
$xml_f = gci "C:\SCtech\Burodent\ElRech\*.xml" -file | select -f 1
  1. Extrahiere Kunden- und Vorgangsnummer aus dem Dateiname
$xml_f.name | sls -pattern "" im Ausdruck oder in der Anweisung.
Bei C:\Users\Martin\Desktop\Test1.ps1:6 Zeichen:29

back-to-top$customers = ipcsv C:\Users\ <<<< Martin\Desktop\customers.csv" -delimiter ";" -header "number","name"

+ CategoryInfo : ParserError: (number","name"... sls -pattern ":String) , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken


In der customers.csv steht ....ich belass es jetzt einfach bei dem echten Fall .....

437401;Prescher
02-419892;Goepfert
309001;Just


Gruß von Martin, der sich jetzt wirklich doof vorkommt ....
Member: rubberman
rubberman Oct 27, 2020 at 13:27:58 (UTC)
Goto Top
Kämpfen wir uns mal von vorn durch ...
$customers = ipcsv C:\Users\Martin\Desktop\customers.csv" -delimiter ";" -header "number","name"
Steht im realen Script vor C: ein Anführungszeichen oder hast du das vergessen?

Setffen
Member: MmarKuss
MmarKuss Oct 27, 2020 at 14:55:28 (UTC)
Goto Top
Ich hab´s genaus so kopiert und geschickt, wie´s drin steht ...
Member: rubberman
rubberman Oct 27, 2020 at 15:07:41 (UTC)
Goto Top
Dann fehlt das wohl, was die ganze Sache unbalanciert macht, denn aktuell hast du eine ungerade Anzahl (7) Anführungszeichen in der Zeile, was nahezu immer verkehrt ist. face-wink Setze es mal davor und schau mal ob sich die restlichen Fehler erledigen bzw. wie sie nun aussehen.
Member: MmarKuss
MmarKuss Oct 27, 2020 at 15:18:20 (UTC)
Goto Top
Jetzt geb ich glaube ich langsam auf ....

Anführungszeichen vor C\........... gesetzt, Powershell ISE neu gestarted.. Meldung:

PS C:\Users\Martin> C:\Users\Martin\Desktop\Test1.ps1
Die Datei "C:\Users\Martin\Desktop\Test1.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen erhalten Sie mit "get-help about_signing".
At line:0 char:0

In powershell.exe die Befehle

Set-ExecutionPolicy Unrestricted

und

Set-ExecutionPolicy Allsigned

ausgeführt und mit "j" bestätigt...

...keine Chance.

Martin
Member: MmarKuss
MmarKuss Oct 27, 2020 at 15:20:29 (UTC)
Goto Top
Ich kämpfe mich jetzt erst mal durch´s Internet, wie man das Ding dauerhaft zum Laufen bringt, bevor ich Dir auch damit noch die Zeit stehle....
Member: rubberman
rubberman Oct 27, 2020 at 16:42:48 (UTC)
Goto Top
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:
@powershell -NoProfile -ExecutionPolicy Bypass -Command "& '.\Test1.ps1'"  
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
Member: MmarKuss
MmarKuss Oct 27, 2020 at 17:10:02 (UTC)
Goto Top
Ich hab´s )))

Mit Powershell ausführen schließt immer sofort das Fenster und ich kann nicht sehen, was passiert ist, daher ISE bis es passt )))

Skript sieht jetzt so aus:

  1. Lese Datei customers.csv
$customers = ipcsv "C:\customers.csv" -delimiter ";" -header "number","name"
  1. Selektiere eine XML Datei
$xml_f = gci "C:\SCtech\Burodent\ElRech\*.xml" -file | select -f 1
  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}
  1. Finde den Kundenname anhand der Kundennummer in den CSV Daten
$customername = $customers | ?{$_.number -eq $customernumber} | select -ExpandProperty name
  1. Pfad mit Vorgangsnummer als String
$case_d = $("C:\SCtech\Burodent\ElRech\$case")
  1. Pfad mit Vorgangsnummer anlegen
ni $case_d -itemtype directory -force | out-null
  1. XML Datei verschieben
$xml_f | mv -destination $case_d
  1. PDF Datei anhand Kundenname finden und verschieben
gci ("C:\SCtech\Burodent\PDF\*RE_" + $customername + "*.pdf") -file | select -f 1 | mv -destination $case_d
  1. Nextcloud Pfad mit Kundenname als String
$cloud_d = ($env:USERPROFILE + "\Nextcloud\Rechnungen\" + $customername + " Rechnungen")
  1. Wenn Nextcloud Pfad mit Kundenname nicht existiert, dann anlegen
if(!(test-path $cloud_d)){
ni $cloud_d -itemtype directory | out-null
}
  1. Verzeichnis mit Vorgangsnummer in Nextcloud Pfad verschieben
mv $case_d $cloud_d
pause


Die ISE meint dazu

PS C:\Users\Martin> C:\Users\Martin\Desktop\Test1.ps1
Get-ChildItem
Es wurde kein Parameter gefunden, der dem Parameternamen "file" entspricht.


Bei C:\Users\Martin\Desktop\Test1.ps1:4 Zeichen:53

back-to-top$xml_f = gci "C:\SCtech\Burodent\ElRech\*.xml" -file <<<< | select -f 1

+ CategoryInfo : InvalidArgument: (face-smile [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

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.
Bei C:\Users\Martin\Desktop\Test1.ps1:6 Zeichen:18

back-to-top$xml_f.name | sls <<<< -pattern "((^|^\d{2}-)\d{3,})-(\d+-)*(\d+)(?=-[A-Z]+-)" | %{$customernumber =

$_.matches.groups[1].value; $case = $_.matches.groups[4].value}
+ CategoryInfo : ObjectNotFound: (sls:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

Move-Item : Das Argument kann nicht an den Parameter "Path" gebunden werden, da es NULL ist.
Bei C:\Users\Martin\Desktop\Test1.ps1:14 Zeichen:12

back-to-top$xml_f | mv <<<< -destination $case_d

+ CategoryInfo : InvalidData: (face-smile [Move-Item], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Comma
nds.MoveItemCommand

Get-ChildItem : Es wurde kein Parameter gefunden, der dem Parameternamen "file" entspricht.
Bei C:\Users\Martin\Desktop\Test1.ps1:16 Zeichen:68

back-to-topgci ("C:\SCtech\Burodent\PDF\*RE_" + $customername + "*.pdf") -file <<<< | select -f 1 | mv -destinat

ion $case_d
+ CategoryInfo : InvalidArgument: (face-smile [Get-ChildItem], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand

Move-Item : Eine Datei kann nicht erstellt werden, wenn sie bereits vorhanden ist.

Bei C:\Users\Martin\Desktop\Test1.ps1:24 Zeichen:3

back-to-topmv <<<< $case_d $cloud_d

+ CategoryInfo : WriteError: (C:\SCtech\Burodent\ElRech\:DirectoryInfo) [Move-Item], IOExc
eption
+ FullyQualifiedErrorId : MoveDirectoryItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

Die Benennung "pause" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines au
sführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (
sofern enthalten), und wiederholen Sie den Vorgang.
Bei C:\Users\Martin\Desktop\Test1.ps1:25 Zeichen:6

back-to-toppause <<<<

+ CategoryInfo : ObjectNotFound: (pause:String) , CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException


Gruß Martin
Member: rubberman
rubberman Oct 27, 2020 at 17:28:31 (UTC)
Goto Top
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?

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 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)
Member: MmarKuss
MmarKuss Oct 27, 2020 updated at 19:40:38 (UTC)
Goto Top
Die Datei customers.csv steht im Verzeichnis C:\Users\Martin
Inhalt:
437401;........
02-419892;.................
309001;Just..............

Die Datei 309001-4313-ZE-5030-1-8.xml steht im Verzeichnis C:\SCtech\Burodent\ElRech

sls = Select-String hat geholfen )
Member: rubberman
rubberman Oct 27, 2020 at 17:57:39 (UTC)
Goto Top
Sieht so aus als müsste ich mein PS vergewaltigen, dass es sich wie die alte Version 2 verhält, um dir weiter zu helfen.
Ich komme wieder, wenn ich es hinbekommen habe und den Code auf alt getrimmt habe...
Member: MmarKuss
MmarKuss Oct 27, 2020 at 18:01:28 (UTC)
Goto Top
...schneller passier,t wenn ich eine andere Version runterlade ?
Wenn ja, welche ?
...arbeite allerdings noch mit Windows7 professsional 64 bit ...
Member: MmarKuss
MmarKuss Oct 27, 2020 at 18:03:01 (UTC)
Goto Top
...mein geliebtes Abrechnungsprogramm kann kein Windows10 .....
Member: rubberman
rubberman Oct 27, 2020 at 18:15:47 (UTC)
Goto Top
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.
Member: MmarKuss
MmarKuss Oct 27, 2020 at 18:58:49 (UTC)
Goto Top
Steffen - Du bist gut ...einfach gut ))))
Vielen Dank - es läuft.

Wie üblich aber gibt es einen kleinen Haken...

Heißt die xml z.B. 437401-BREIT-ZE-1-1-1.xml ( bei Privatpatienten kann es sein, daß vor dem "ZE" Buchstaben stehen ),
dann funktioniert es nicht.
Läßt sich das einfach beheben, oder muss ich mir dafür etwas anderes einfallen lassen ?

Für - wie ursprünglich als bat geplant - wollte ich das Programm LogMonitor benutzen, um alle 60 Sekunden automatisch checken zu lassen, ob eine
neue xml im Verzeichnis steht ...dann automatisch die bat ausführen.

Ist eine ps1 auch per se eine ausführbare Datei ?
Member: MmarKuss
MmarKuss Oct 27, 2020 at 19:19:51 (UTC)
Goto Top
...ich schreibe eine batch , die ich dann per Logmonitor aufrufe ...


Powershell.exe -Command "& 'C:\Users\Martin\Desktop\Datentransfer.ps1'"

Sollte funktionieren ....

Punkt 2 sollte also erledigt sein, das bekomme ich hin )))
...erst nachdenken, dann fragen ))))
Member: rubberman
rubberman Oct 27, 2020 updated at 19:51:03 (UTC)
Goto Top
Hilf noch mal
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'"  
Zusätzliche Batchdatei brauchst du dann wohl nicht.
Member: MmarKuss
MmarKuss Oct 27, 2020 at 19:30:46 (UTC)
Goto Top
...solltest Du heute noch antworten , nicht wundern, daß keine Antwort zurückkommt ,
...ich muß noch etwas erledigen und raus aus dem Laden )

Ich weiß nicht so recht wie ich Dir danken soll - mit Programmier-Tips sicherlich nicht ...........)))

Aber solltest Du mal ein Krönchen brauchen - sag Bescheid. Man sagt, ich sei nicht so schlecht in meinem Job und so etwas geht auch per Post )))
pdf und xml werden wir dabei nicht brauchen )))...Du hast was gut bei mir.

Hab nen schönen Abend

Gruß Martin
Member: MmarKuss
MmarKuss Oct 27, 2020 at 19:31:38 (UTC)
Goto Top
...werde ich morgen testen )
Member: MmarKuss
MmarKuss Oct 27, 2020 at 19:33:55 (UTC)
Goto Top
Bei Privatpatienten gibt´s nur "ZE"....
Member: rubberman
rubberman Oct 27, 2020 at 19:41:25 (UTC)
Goto Top
Ja, mag sein. Aber das Pattern ist für alle. Wenn es mehr als ZE und KBR gibt, musst du es ergänzen.
Member: MmarKuss
MmarKuss Oct 27, 2020 at 19:46:20 (UTC)
Goto Top
...gibt nur "ZE" und "KBR" ...
Member: rubberman
rubberman Oct 27, 2020 at 19:50:36 (UTC)
Goto Top
OK, dann sollte das Pattern Update bereits passen.
Member: MmarKuss
MmarKuss Oct 28, 2020 at 10:08:50 (UTC)
Goto Top
Hallo Steffen,

läuft ALLES perfekt !!

Danke Dir vielmals !!!

Gruß

Martin
Member: rubberman
rubberman Oct 28, 2020 at 12:02:00 (UTC)
Goto Top
Sehr gut. Danke für die Rückmeldung!

Grüße
Steffen