Jump to content

Dateinamen aus Excel-Liste fischen und diese Dateien kopieren


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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

Link zu diesem Kommentar
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

bearbeitet von BOfH_666
Link zu diesem Kommentar

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

bearbeitet von testperson
Link zu diesem Kommentar

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

Link zu diesem Kommentar
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 von Sunny61
Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

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.

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...