Powershell Script was PDFs mit gleicher Nummerfolge
Guten Tag zusammen,
ich habe derzeit ein Script welches Dateien von a nach b kopiert und die nicht benötigten Dateien direkt löscht. Diese Dateien sollen mit Rechnungen und Lieferscheinen verglichen werden und seperat in einen Ordner verschoben werden damit Dateien die zusammen gehören zusammen sind.
$destinationPath = "\\SRV-DC\Fortdress\4_IT\Testordner\0_GB_Automatisierung\orders"
Write-Host "Der Quellpfad existiert nicht."
exit
}
Write-Host "Der Zielpfad existiert nicht. Er wird erstellt."
New-Item -Path $destinationPath -ItemType Directory -Force
}
$destinationFile = Join-Path -Path $destinationPath -ChildPath $_.Name
Move-Item -Path $_.FullName -Destination $destinationFile -Force
Write-Host "Die Datei $($_.Name) wurde verschoben nach $destinationPath."
}
if ($filesToDelete) {
$filesToDelete | ForEach-Object {
Remove-Item -Path $_.FullName -Force
Write-Host "Die Datei $($_.Name) wurde gelöscht."
}
} else {
Write-Host "Es wurden keine Dateien zum Löschen gefunden."
}
foreach ($file in $pdfFiles) {
ich habe derzeit ein Script welches Dateien von a nach b kopiert und die nicht benötigten Dateien direkt löscht. Diese Dateien sollen mit Rechnungen und Lieferscheinen verglichen werden und seperat in einen Ordner verschoben werden damit Dateien die zusammen gehören zusammen sind.
- Quellpfad und Zielpfad für Verschieben definieren
$destinationPath = "\\SRV-DC\Fortdress\4_IT\Testordner\0_GB_Automatisierung\orders"
- Überprüfen, ob der Quellpfad existiert
Write-Host "Der Quellpfad existiert nicht."
exit
}
- Überprüfen, ob der Zielpfad existiert, andernfalls erstellen
Write-Host "Der Zielpfad existiert nicht. Er wird erstellt."
New-Item -Path $destinationPath -ItemType Directory -Force
}
- Alle PDF-Dateien, die mit "1004.M" beginnen, auswählen und in den Zielpfad verschieben
$destinationFile = Join-Path -Path $destinationPath -ChildPath $_.Name
Move-Item -Path $_.FullName -Destination $destinationFile -Force
Write-Host "Die Datei $($_.Name) wurde verschoben nach $destinationPath."
}
- Löschen aller PDF-Dateien, die mit "1001.M", "1002.M" oder "1005.M" beginnen
if ($filesToDelete) {
$filesToDelete | ForEach-Object {
Remove-Item -Path $_.FullName -Force
Write-Host "Die Datei $($_.Name) wurde gelöscht."
}
} else {
Write-Host "Es wurden keine Dateien zum Löschen gefunden."
}
- Alle PDF-Dateien im Quellpfad auswählen
- Durchsuchen der Dateien und Erstellen von Ordnern basierend auf den übereinstimmenden Nummern ab dem letzten Unterstrich oder Bindestrich
foreach ($file in $pdfFiles) {
- Extrahieren des Teils des Dateinamens ab dem letzten Unterstrich oder Bindestrich
- Überprüfen, ob ein entsprechender Ordner bereits erstellt wurde
- Verschieben der Datei in den entsprechenden Ordner
$number = $Matches[1]
} elseif ($file.BaseName -match '.*\-([^\-]+)$') {
$number = $Matches[1]
} else {
continue # Wenn kein Unterstrich oder Bindestrich gefunden wurde, überspringen
}
$folders[$number] = Join-Path -Path $destinationPath -ChildPath $number
New-Item -Path $folders[$number] -ItemType Directory -Force
}
Write-Host "Die Datei $($file.Name) wurde verschoben nach $($folders[$number])."
}
Dies ist das Scrip doch es erstellt nur 1-2 Ordner und das jedes mal mit einer Datei.
Ein Bild wie die Namensgebung ist habe ich dabei gefügt.
Der Grundgedanke ist, dass wir unsere Buchhaltung entlasten wollen. Die haben täglich händisch nach diesen Dokumenten gesucht und in Ordner gepackt und per Mail verschickt. Deswegen wollen wir die Dateien erstmal alle in einen Ordner packen und die passen Dateien mittels Powershell in die jeweiligen richtigen Ordner packen. Also kurz gesagt Bestellnummer (13 Stellige Zahl am Ende des Dateinamens) matcht mit anderen Dateien und diese sollen gemeinsam in einen Ordner mit dem Bestellnummer Dateinamen verschoben werden.
Entschuldigung für den langen Text und nicht das beste deutsch.
Danke!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 92790128404
Url: https://administrator.de/contentid/92790128404
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
6 Kommentare
Neuester Kommentar
Bin mir nicht sicher ob ich das richtig verstanden habe und finde es persönlich recht schwer nachzuvollziehen und zu testen ohne Test Dateien zu haben, aber wenn es doch 13 stellen sind kann man das ganze doch abkürzen?
# Pfade
$sourcePath = "C:\exxtainer\pdfmapper\data\out\orders"
$destinationPath = "\\SRV-DC\Fortdress\4_IT\Testordner\0_GB_Automatisierung\orders"
# Alle PDF-Dateien
$pdfFiles = Get-ChildItem -Path $sourcePath -Filter "*.pdf"
# Bestellnummer aus Dateinamen extrahieren
$bestellnummern = $pdfFiles | ForEach-Object {
$_.Name -match '.*(\d{13}).pdf'
$Matches[1]
}
# Für jede Bestellnummer einen Ordner erstellen und die Dateien verschieben
foreach ($bestellnummer in $bestellnummern) {
$targetFolder = Join-Path -Path $destinationPath -ChildPath $bestellnummer
New-Item -Path $targetFolder -ItemType Directory -Force
$matchingFiles = $pdfFiles | Where-Object { $_.Name -match ".*$bestellnummer\.pdf" }
Move-Item -Path $matchingFiles.FullName -Destination $targetFolder -Force
}
Write-Host "*-*Dateien wurden erfolgreich verschoben.*-*"
# Pfade
$sourcePath = "C:\exxtainer\pdfmapper\data\out\orders"
$destinationPath = "\\SRV-DC\Fortdress\4_IT\Testordner\0_GB_Automatisierung\orders"
ls $sourcepath -file -Recurse | ? Basename -match '\d+$' | group {$matches[0]} | %{
$d = join-path $destinationPath $_.Name
if (!(Test-Path $d -PathType Container)) {new-item -type dir -Path $d}
$_.Group | move-item -Destination $d
}
Zitat von @Dbgrox:
Danke puderpader,
hat grundlegend sehr gut funktioniert. Hast du evtl. einen Tipp, dass nur welche die die gleiche 13 stellige Zahlenfolge in einen gemeinsamen Ordner verschiebt und die anderen sozusagen ignoriert, bis neue Dateien dazu kommen die dann nochmal abgeglichen werden?
Macht das schon. Es gruppiert die Dateien anhand der Nummer am Ende des Basename und schiebt die zusammengehörigen Dateien jeweils in einen Ordner der den Namen der Nummer trägt. Dateien welche keine Nummer am Ende haben werden ignoriert.Danke puderpader,
hat grundlegend sehr gut funktioniert. Hast du evtl. einen Tipp, dass nur welche die die gleiche 13 stellige Zahlenfolge in einen gemeinsamen Ordner verschiebt und die anderen sozusagen ignoriert, bis neue Dateien dazu kommen die dann nochmal abgeglichen werden?
Vor dem Skript
Nach dem Skript
Wen du es auf Dateien mit 13 Stellen am Ende beschränken willst ändere den Regex einfach so ab
...... | ? Basename -match '\d{13}$' | .....