Jump to content
Sign in to follow this  
addy0604

Dateinamen aus Excel-Liste fischen und diese Dateien kopieren

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.  ;-):D

Edited by BOfH_666

Share this post


Link to post
Share on other sites

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:

  1. Import-CSV (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/import-csv?view=powershell-6)
  2. foreach (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_foreach?view=powershell-6)
  3. Get-ChildItem (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-6)
  4. 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

Edited by testperson
  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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. ;)

Edited by Sunny61

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...