addy0604 11 Geschrieben 4. Juni 2019 Melden Teilen Geschrieben 4. Juni 2019 Hallo Zusammen, meine Scripting-Kenntnisse sind leider sehr bescheiden, deshalb weiß ich momentan nicht, wie ich an mein Problem am besten herangehe. Folgende Situation habe ich... Ich habe auf dem Server ein Verzeichnis, in dem täglich automatisiert Unterverzeichnisse erstell werden und in diesen landen dann einer Reihe von PDF-Dateien. Die Namen der PDF-Dateien beginnen alle mit der Kundennummer und danach eine Beschreibung des Inhaltes, z.B. Vertrag, Vertragsentwurf, Vertrag-unterzeichnet etc. Nun bekomme ich jeden Tag eine Excel-Datei (CSV ist auch möglich), wo in der ersten Spalte die Kundennummer steht. Jetzt sollen alle PDF-Dateien, die mit der Kundennummer in Spalte 1 der Excel-Datei beginnt und mit "Vertrag-unterzeichnet" endet, in ein separates Verzeichnis kopiert werden. Mit Powershell wird es wohl irgendwie gehen, aber damit hab ich mich noch nicht so viel beschäftigt. Geht so was auch mit einem Makro? Und kann man das dann auch per Aufgabenplanung ausführen? Bin für jede Hilfe dankbar... Grüße Matthias Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 4. Juni 2019 Melden Teilen Geschrieben 4. Juni 2019 (bearbeitet) vor 8 Minuten schrieb addy0604: Mit Powershell wird es wohl irgendwie gehen, aber damit hab ich mich noch nicht so viel beschäftigt. ... dann wird's aber Zeit ... das ist mit Powershell meiner Meinung nach sogar sehr einfach. vor 8 Minuten schrieb addy0604: Geht so was auch mit einem Makro? Und kann man das dann auch per Aufgabenplanung ausführen? Ich gehe davon aus, dass Du ein Excel-Makro meinst. Ich würde vermuten, dass das auch funktioniert, glaube aber, dass das sogar etwas aufwändiger wäre als mit einem Powershell-Script. Als Start-Hilfe könntest Du Dir die cmdlets Get-ChildItem, Where-Object, Foreach-Object, Copy-Item und Move-Item anschauen. Wenn Du Dir jeweils die komplette Hilfe inklusive der Beispiele anschaust, hast Du fast schon alles, was Du brauchst ... und wenn Du stecken bleibst, kannst Du hier wieder fragen. bearbeitet 4. Juni 2019 von BOfH_666 Zitieren Link zu diesem Kommentar
testperson 1.680 Geschrieben 4. Juni 2019 Melden Teilen Geschrieben 4. Juni 2019 (bearbeitet) Hi, vor 11 Minuten schrieb addy0604: Mit Powershell wird es wohl irgendwie gehen, aber damit hab ich mich noch nicht so viel beschäftigt. dann solltest du damit mal anfangen. ;) Für dich wäre interessant: Import-CSV (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-6) foreach (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-6) Get-ChildItem (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-6) Copy-Item (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/copy-item?view=powershell-6) vor 11 Minuten schrieb addy0604: Geht so was auch mit einem Makro? Und kann man das dann auch per Aufgabenplanung ausführen? Sollte auch machbar sein. PowerShell wäre da aber in meinen Augen zu favorisieren. Gruß Jan bearbeitet 4. Juni 2019 von testperson 1 Zitieren Link zu diesem Kommentar
addy0604 11 Geschrieben 4. Juni 2019 Autor Melden Teilen Geschrieben 4. Juni 2019 Schau ich mir gleich mal an... mal sehen ob ich was gestrickt kriege... Vielen Dank schon mal. Gruß Matthias Zitieren Link zu diesem Kommentar
addy0604 11 Geschrieben 4. Juni 2019 Autor Melden Teilen Geschrieben 4. Juni 2019 Hmmm... also Teile habe ich hinbekommen, aber ein Ganzes ist es noch nicht geworden... Das ist der Inhalt der CSV-Datei, von der ich nur die "Counterparty Number" brauche: Counterparty Number;Last Name;First Name;Entry Date 9701278;Schubert;Heinrich;29.03.2019 9701138;Kowalczyk;Klaus;29.03.2019 9700808;Markovic;Walter;29.03.2019 Die foreach-Schleife habe ich so gebastelt: Import-Csv ".\test1.csv" | foreach { $Ausgabe = ($_."Counterparty Number") Write-Host "$Ausgabe"} Dann bekomme ich zumindest das angezeigt: 9701278 9701138 9700808 Um die PDF-Datei in den Unterordnern zu finden und zu kopieren hab ich es so gelöst und funktioniert auch soweit: Get-ChildItem -Path c:\test\signatur\ -Include 9700106*Contract.pdf -Recurse | Copy-Item -Destination c:\test\test1 Die hier fest eingetragene Kundennummer "9700106" muss allerdings dann durch die Nummer "Counterparty Number" aus der CSV-Datei ersetzt werden. Aber wie bekomme ich die beiden Sachen jetzt miteinander verbunden, das im Get-Childitem-String statt der statisch eingetragenen Nummer die Variable $Ausgabe aus der foreach-Schleife auftaucht? Da hängt es bei mir an der Syntax. Kann man den Get-Childitem-String da überhaupt so einbauen? Oder gibt es eine bessere Lösung? Grüße Matthias Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 4. Juni 2019 Melden Teilen Geschrieben 4. Juni 2019 (bearbeitet) vor 23 Minuten schrieb addy0604: $Ausgabe = ($_."Counterparty Number") Write-Host "$Ausgabe"} Dann bekomme ich zumindest das angezeigt: 9701278 9701138 9700808 Um die PDF-Datei in den Unterordnern zu finden und zu kopieren hab ich es so gelöst und funktioniert auch soweit: Get-ChildItem -Path c:\test\signatur\ -Include 9700106*Contract.pdf -Recurse | Copy-Item -Destination c:\test\test1 Ohne es selbst getestet zu haben, so sollte es funktionieren: $Ausgabe = ($_."Counterparty Number") $Datei = $Ausgabe"*Contract.pdf" Write-Host $Datei Get-ChildItem -Path c:\test\signatur\ -Include $Datei-Recurse | Copy-Item -Destination c:\test\test1 Write-Host "$Ausgabe"} Bei $Datei bin ich mir nicht sicher, müsstest Du testen. Evtl. auch nur ein einfaches Anführungszeichen oder auch Fliegenschiss genannt. ;) bearbeitet 4. Juni 2019 von Sunny61 Zitieren Link zu diesem Kommentar
addy0604 11 Geschrieben 4. Juni 2019 Autor Melden Teilen Geschrieben 4. Juni 2019 Hallo Sunny, yep, ein Plus-Zeichen musste noch dazwischen, dann passt es. Hier noch mal der ganze Code: Import-Csv ".\test1.csv" | foreach { $Ausgabe = ($_."Counterparty Number") $Datei = $Ausgabe + "*Contract.pdf" Write-Host "$Datei" Get-ChildItem -Path c:\test\signatur\ -Include $Datei -Recurse | Copy-Item -Destination c:\test\test1 } Das passt prima. Besten Dank und schöne Grüße Matthias Zitieren Link zu diesem Kommentar
addy0604 11 Geschrieben 5. Juni 2019 Autor Melden Teilen Geschrieben 5. Juni 2019 Nachtrag nur der Vollständigkeit halber... Ich bekomme ja jeden Tag eine CSV-Datei mit aktuellem Datum im Dateinamen. Der sieht dann so aus: Neukunden_20190605_1.csv Deshalb hab ich den Import-csv-String noch mit einer Variable umgestrickt: $Filename = 'Neukunden_' + [datetime]::today.tostring('yyyyMMdd') + '_1.csv' Import-Csv -Path "c:\test\signatur\$Filename" -Delimiter ";" | foreach { $Ausgabe = ($_."Counterparty Number") $Datei = $Ausgabe + "*Contract.pdf" Get-ChildItem -Path c:\test\signatur\ -Include $Datei -Recurse | Copy-Item -Destination c:\test\test1 } Die Write-Host Einträge werde ich dann wieder rausnehmen. War ja nur zur Kontrolle in der ISE... Grüße Matthias Zitieren Link zu diesem Kommentar
Sunny61 806 Geschrieben 5. Juni 2019 Melden Teilen Geschrieben 5. Juni 2019 Mit Test-Path docs\Dateiname.endung kriegst Du raus ob die Datei auch wirklich existiert und kannst passend drauf reagieren. ;) Kann nicht schaden. https://www.windowspro.de/script/test-path-powershell-pruefen-ob-eine-datei-existiert Und in der ISE kannst Du auch mit F9 einen Haltepunkt auf eine Zeile setzen, dann bleibt die Progammausführung an der Stelle stehen und Du kannst mittels MouseOver die Inhalte der Variablen sehen. Und anstatt der ISE kannst Du auch Visual Code (kostenlos) einsetzen. Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.