dbgrox
Goto Top

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.

  1. Quellpfad und Zielpfad für Verschieben definieren
$sourcePath = "C:\exxtainer\pdfmapper\data\out\orders"
$destinationPath = "\\SRV-DC\Fortdress\4_IT\Testordner\0_GB_Automatisierung\orders"

  1. Überprüfen, ob der Quellpfad existiert
if (-not (Test-Path $sourcePath)) {
Write-Host "Der Quellpfad existiert nicht."
exit
}

  1. Überprüfen, ob der Zielpfad existiert, andernfalls erstellen
if (-not (Test-Path $destinationPath)) {
Write-Host "Der Zielpfad existiert nicht. Er wird erstellt."
New-Item -Path $destinationPath -ItemType Directory -Force
}

  1. Alle PDF-Dateien, die mit "1004.M" beginnen, auswählen und in den Zielpfad verschieben
Get-ChildItem -Path $sourcePath -Filter "1004.M*.pdf" | ForEach-Object {
$destinationFile = Join-Path -Path $destinationPath -ChildPath $_.Name
Move-Item -Path $_.FullName -Destination $destinationFile -Force
Write-Host "Die Datei $($_.Name) wurde verschoben nach $destinationPath."
}

  1. Löschen aller PDF-Dateien, die mit "1001.M", "1002.M" oder "1005.M" beginnen
$filesToDelete = Get-ChildItem -Path $sourcePath -Filter "1001.M*.pdf", "1002.M*.pdf", "1005.M*.pdf"
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."
}

  1. Alle PDF-Dateien im Quellpfad auswählen
$pdfFiles = Get-ChildItem -Path $sourcePath -Filter "*.pdf"

  1. Durchsuchen der Dateien und Erstellen von Ordnern basierend auf den übereinstimmenden Nummern ab dem letzten Unterstrich oder Bindestrich
$folders = @{}
foreach ($file in $pdfFiles) {
          1. Extrahieren des Teils des Dateinamens ab dem letzten Unterstrich oder Bindestrich
          if ($file.BaseName -match '.*[\\_]([^\\_]+)$') {
          $number = $Matches[1]
          } elseif ($file.BaseName -match '.*\-([^\-]+)$') {
          $number = $Matches[1]
          } else {
          continue # Wenn kein Unterstrich oder Bindestrich gefunden wurde, überspringen
          }

                  1. Überprüfen, ob ein entsprechender Ordner bereits erstellt wurde
                  if (-not $folders.ContainsKey($number)) {
                  $folders[$number] = Join-Path -Path $destinationPath -ChildPath $number
                  New-Item -Path $folders[$number] -ItemType Directory -Force
                  }

                          1. Verschieben der Datei in den entsprechenden Ordner
                          Move-Item -Path $file.FullName -Destination $folders[$number] -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!
                          screenshot 2024-03-12 153538

Content-Key: 92790128404

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

Printed on: April 27, 2024 at 20:04 o'clock

Member: Springstil
Springstil Mar 12, 2024 at 14:32:50 (UTC)
Goto Top
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.*-*"  
Member: Dbgrox
Dbgrox Mar 13, 2024 at 06:26:19 (UTC)
Goto Top
Guten Tag und Danke,

leider bekomme ich da nur einen False Ordner ohne Inhalt erstellt.

Gibt es noch andere Möglichkeiten wie Powershell matchende 13 stellige Nummern zusammen in einen Ordner verschiebt?
Member: Springstil
Springstil Mar 13, 2024 updated at 10:29:34 (UTC)
Goto Top
kannst du mir mal 3 datei namen nennen damit ich das bei mir nachstellen kann?

EDIT: Oben bei den neuen Bild sind nur CSV dateien zu sehen, aber dachte es geht um PDF dateien? oder doch um beides ?
Mitglied: 12168552861
Solution 12168552861 Mar 13, 2024 updated at 10:39:11 (UTC)
Goto Top
# 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
}
Gruß pp.
Member: Dbgrox
Dbgrox Mar 13, 2024 at 11:49:12 (UTC)
Goto Top
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?
Mitglied: 12168552861
12168552861 Mar 13, 2024 updated at 12:15:14 (UTC)
Goto Top
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.

Vor dem Skript

screenshot

Nach dem Skript

screenshot

Wen du es auf Dateien mit 13 Stellen am Ende beschränken willst ändere den Regex einfach so ab
...... | ? Basename -match '\d{13}$' | .....