darebo
Goto Top

Dateien anhand Entscheidung in Excel-Tabelle umbenennen

Die Ordnerstruktur mit den Dateien ist folgende:

Quelle:


C:\PDF\A\Ordner-1
bis
C:\PDF\A\Ordner-100000

.

C:\PDF\...\Ordner-1
bis
C:\PDF\...\Ordner-100000


In den Ordnern (1 bis 100000) befinden sich jeweils PDF-Dateien unterschiedlicher Anzahl beginnend mit der Bezeichnung datei1.pdf usw..

Excel Liste:


Spalte A zeigt als Beispiel die Oberordner (Menge ca. 10.000)
Spalte B zeigt als Beispiel die Unterordner (Menge ca. 100.000)
Spalte C zeigt als Beispiel den Status (Entscheidung) ja oder nein

unbenannt

In den Unterordnern befinden sich eine unterschiedliche Anzahl von PDF-Dateien, die Anhand des Status (der Entscheidung) umbenannt werden sollen.

Status=nein --> Datei1.pdf in jeweiligen Unterordner umbenennen in Datei1.nein usw.
Status=ja --> Datei1.pdf wird nicht umbenannt usw. (also keine Aktion in dem jeweiligen Unterordner)

Ziel:

Ergebnisbeispiel:

C:\PDF\A\1\Datei1.pdf
C:\PDF\A\1\Datei2.pdf

.

C:\PDF\A\2\Datei1.nein
C:\PDF\A\2\Datei2.nein
C:\PDF\A\2\Datei3.nein

usw.


Ansatz:

Mein erster Ansatz war folgender:

# CSV-Datei mit drei Spalten für Überschrift 'Oberordner' ; 'Unterordner' und 'Status' und ';' als Trenner 
$sourcefile = 'C:\PDF\Script\Excel-Liste.csv'   
# Ordner mit Unterordnern 

$quelle1 = 'C:\PDF'  

Import-CSV $sourcefile  -Delimiter ";" | %{   

# quellordner 

$source = "$quelle1\$($_.Oberordner)"   

# wenn Status = nein für Unterordner in Tabelle dann benenne alle Dateien im Unterordner um - *.pdf nach *.nein
# eventuell mit rename-item 

if ...
Weiter bin ich aktuell nicht gekommen.

Schön wäre wenn dies als Powershell-Variante realisiert werden könnte.

Vorab schon mal Danke für Eure Unterstützung.

Content-Key: 398972

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

Ausgedruckt am: 19.03.2024 um 04:03 Uhr

Mitglied: colinardo
Lösung colinardo 22.01.2019 aktualisiert um 13:21:46 Uhr
Goto Top
Servus.
Bei einer CSV die so aussieht:
Oberordner;Unterordner;Status
A;1;ja
A;2;nein
A;3;ja
A;4;nein
B;1;ja
B;2;nein
B;3;ja
B;4;nein
Nimmst du:
$folder = 'D:\Root'  
$liste = 'D:\darebo\liste.csv'  
$csv = Import-CSV $liste -Delimiter ";"  
$csv | ?{$_.Status -eq 'nein'} | %{  
    gci "$folder\$($_.Oberordner)\$($_.Unterordner)\*.pdf" -File | rename-item -NewName {"$($_.BaseName).nein"} -verbose  
} 
Oder wenn es ein XLSX File ist dass genau so aufgebaut wie in deiner Grafik oben:
$folder = 'D:\Root'  
$liste = 'D:\darebo\liste.csv'  

# Excel Objekt
$objExcel = New-Object -Com Excel.Application
# Mappe öffnen
$wb = $objExcel.Workbooks.Open($liste)
# Excel anzeigen
$objExcel.Visible = $true
$objExcel.DisplayAlerts = $false
$ws = $wb.Sheets.Item(1)
$ws.Range("A1:A" + $ws.Cells($ws.Rows.Count,2).End(-4162).Row) | %{  
    if ($_.Value() -ne ""){  
        $oberordner = $_.Value()
    }
    if($_.Offset(0,2).Value() -eq 'nein'){  
        gci "$folder\$oberordner\$($_.Offset(0,1).Value())" -Filter *.pdf -File | rename-item -NewName {"$($_.BaseName).nein"} -verbose  
    }
}

$objExcel.DisplayAlerts = $true
# Dokument schließen
$wb.Close($false) | out-null
# Excel schließen
$objExcel.Quit()
# Ressourcen freigeben
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($objExcel) | out-null
Viel Spaß
Grüße Uwe
Mitglied: darebo
darebo 22.01.2019 um 12:54:00 Uhr
Goto Top
Hallo Uwe,

danke für die schnelle Antwort.

Den ersten Code mit der CSV-Datei habe ich gerade getestet und alles funktioniert einwandfrei. Es kamen bloß ein paar (Fehler-)Meldungen, die aber nicht an deinem Script liegen.

Aber diese Meldungen würde ich gerne abfangen und in dieses Script einbauen oder als extra Prüf-Script nutzen:

1. Prüfe ob alle in der Excel-Liste aufgeführten "Oberorder" und "Unterordner" auch als wirkliches Dateiverzeichnis existieren und gebe dies als Log-Datei mit Status aus. (idealerweise in csv-Format)

2. Prüfe ob alle in Dateiverzeichnis vorhandenen "Oberorder" und "Unterordner" auch wirklich in der Excel-Datei stehen und gebe dies als Log-Datei mit Status aus. (idealerweise in csv-Format)

3. Gibt es "Unterordner" die keine Dateien (*.pdf) enthalten

Grüße
darebo
Mitglied: darebo
darebo 22.01.2019 um 13:19:40 Uhr
Goto Top
Hallo Uwe,

dein zweites Script (xlsx-Variante) läuft durch, aber macht nicht das was es soll. Es benennt die betroffenen Dateien nicht um.
Vielleicht verstehe ich das Script auch nicht vollständig, aber womit wird beim "gci" Aufruf (Zeile 17) der Unterordner angesprochen?

Danke und Gruß
Mitglied: colinardo
Lösung colinardo 22.01.2019 aktualisiert um 14:02:32 Uhr
Goto Top
1.
2.
3.
Sonst noch Wünsche? Massage ...?!
$folder = 'D:\Root'  
$liste = 'D:\darebo\liste.csv'  

$csv = Import-CSV $liste -Delimiter ";"  

$csv | ?{$_.Status -eq 'nein'} | %{  
    $f = "$folder\$($_.Oberordner)\$($_.Unterordner)"  
    if (Test-Path $f){
        gci $f -Filter *.pdf -File | rename-item -NewName {"$($_.BaseName).nein"} -WhatIf -verbose  
    }
} 

# logging ------

# Alle Ordner im File generieren
$folder_in_file = $csv | %{"$folder\$($_.Oberordner)\$($_.Unterordner)"}  
# Alle Ordner im Dateisystem auflisten
$folder_in_filesystem = gci "$folder\*\*" -Directory | select -Expand Fullname  
# Ordnernamen vergleichen
$compare = compare $folder_in_file $folder_in_filesystem -PassThru 

# CSVs generieren

# log für Ordner die im Dateisystem nicht existieren
$compare | ?{$_.SideIndicator -eq '<='} | %{[pscustomobject]@{Name=$_}} | export-csv "$folder\missing_in_filesystem.csv" -Delimiter ";" -NoType -Encoding UTF8  
# log für Ordner die im Dateisystem existieren aber nicht in der Liste
$compare | ?{$_.SideIndicator -eq '=>'} | %{[pscustomobject]@{Name=$_}} | export-csv "$folder\missing_in_list.csv" -Delimiter ";" -NoType -Encoding UTF8  
Output Ordner und Namen für Logs kannst du in den unteren Zeilen anpassen.
dein zweites Script (xlsx-Variante) läuft durch, aber macht nicht das was es soll. Es benennt die betroffenen Dateien nicht um.
Weil im Rename-Item Befehl der Parameter -whatif gesetzt war der dich den Vorgang hätte testen lassen und deswegen keine wirklich Umbenennung vornimmt sondern nur anzeigt was passieren würde face-smile. Hätte man gesehen wenn man sich den Code mal durchgelesen hätte. Habe ihn oben raus genommen um Missverständnisse zu eliminieren.
Vielleicht verstehe ich das Script auch nicht vollständig
Jop.
, aber womit wird beim "gci" Aufruf (Zeile 17) der Unterordner angesprochen?
Mit dem Inhalt der Zellen natürlich face-smile.

So jetzt husch husch, ab in den Powershell Kurs, du sollst ja zumindest noch minimal was selbst machen und uns hier nicht als Clickworker beschäftigenface-wink.

Grüße Uwe
Mitglied: erikro
erikro 22.01.2019 um 13:40:35 Uhr
Goto Top
Moin,

Zitat von @colinardo:

1.
2.
3.
Sonst noch Wünsche? Massage ...?!

Ja, gerne. Und 'n Korn und 'n Bier. face-wink

Liebe Grüße

Erik
Mitglied: emeriks
emeriks 22.01.2019 um 14:04:12 Uhr
Goto Top
Zitat von @colinardo:
Sonst noch Wünsche? Massage ...?!
Ha ha ! face-big-smile
Mitglied: colinardo
colinardo 22.01.2019 aktualisiert um 14:08:08 Uhr
Goto Top
Zitat von @erikro:
Ja, gerne. Und 'n Korn und 'n Bier. face-wink
... und nen Kümmel für den Lümmel face-smile. Alaaf.
Mitglied: darebo
darebo 22.01.2019 um 14:13:14 Uhr
Goto Top
Danke für die Unterstützung, trotz deiner Kritik. Bin gerade noch am Umstieg zu Powershell, daher fehlt dort für komplexere Sachen noch Einiges.

Der -whatif Parameter ist mir schon klar. Das zweite Script (xlsx_Variante) zeigt aber keine Änderung an (das was passieren sollte).
Im ersten Script hatte ich es bereits mit dem -whatif Parameter ausprobiert und dort funktioniert es.
Ich schaue mir die xls-Variante selbst im Detail sowie deine neuen Teile (Logging) nochmal an.

Grüße
darebo