crashzero
Goto Top

Verzeichnistiefe durchgehen und letztes Verzeichnis merken und Inhalt kopieren

Moin, ich mal wieder ....

ich habe eine Verzeichnisstruktur (Wird durch Export leider so vorgegeben) und will nur die Verzeichnisse mit Dateninhalt (z.B. *.pdf) in ein anderes Verzeichnis ausleitung mit dem letzten Verzeichnisnamen in denen sich die Daten befanden.

z.B.

Ordner1 (Leer)
|_____Ordner2(Leer)
|____Ordner3(Leer)
|____Ordner4(Gefüllt mit Dateien)

Das Ziel soll dann so aussehen :

TempOrdner(Existiert bereits)
|___Ordner4(Mit den Dateien)

Wobei die exportierte Ordnerstruktur auch tiefe sein kann als oben angeben.

Mit dem PS-Script funktioniert dies schon ganz gut, leider weiß ich nicht wie ich den Ordnernamen Merke und Schreibe in denen er die Dateien gefunden hatte.
Die Dateien liegen also "lose", ohne Verzeichnisnamenbezug im Ordner "TempOrdner"

get-childitem -path "I:\Daten\StoreTemp\*.*" -recurse -file | copy-item -destination "i:\Daten\test" -Force -verbose  

Wichtig wäre das eigentlich nur das Verzeichnis dort steht in denen sich auch die Dateien befanden.

Content-Key: 1669289068

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

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

Mitglied: 149569
149569 Dec 29, 2021 updated at 12:50:56 (UTC)
Goto Top
p.s. Robocopy würde dir das auch ohne die PS machen face-wink
$quelle = "I:\Daten\StoreTemp"  
$ziel = 'I:\Daten\test'  
Get-ChildItem $quelle -File -Recurse -Force | copy-item -Destination {(md ($_.DirectoryName -replace [regex]::Escape($quelle),$ziel) -Force).Fullname}
Member: Crashzero
Crashzero Dec 29, 2021 at 12:51:06 (UTC)
Goto Top
Ok, robocopy wäre interessanter, habe ich auch schon probiert allerding bekomme ich die Parameter mit der letzten Verzeichniserhaltung dort nicht in den Griff.

Robocopy wäre hierfür eine bessere Lösung hättest du die Parametrierung dafür ?
Mitglied: 149569
149569 Dec 29, 2021 updated at 12:54:58 (UTC)
Goto Top
robocopy "I:\Daten\StoreTemp" "I:\Daten\test" /S /COPYALL /R:5 /W:5  

robocopy /? eingeben und lesen ...
Member: Crashzero
Crashzero Dec 29, 2021 at 12:56:21 (UTC)
Goto Top
Bei dem PS erhalte ich in I:\Daten\test nach wie vor die komplette Verzeichnisstruktur mit Leerverzeichnissen.

$quelle = "I:\Daten\StoreTemp"  
$ziel = 'I:\Daten\test'  
Get-ChildItem $quelle -File -Recurse -Force | copy-item -Destination {(md ($_.DirectoryName -replace [regex]::Escape($quelle),$ziel) -Force).Fullname}

Ziel ist ja NUR z.B. Ordner4 mit Dateien zu erhalten.
Member: StefanKittel
StefanKittel Dec 29, 2021 at 12:57:46 (UTC)
Goto Top
Hallo,

oder einfacher, wenn auch weniger elegant.

Alles kopieren inklusive leerer Verzeichnisse.
Danach alle verzeichniss löschen (rd verzeichnis ohne /s /q). Dabei werden dann nur leere Verzeichnisse gelöscht.

Oder halt nicht batch/cmd verwenden.
Mit VBA/Python/PHP/xyz kann man viel flexibler solche Dinge erledigen.

Stefan
Mitglied: 149569
149569 Dec 29, 2021 updated at 13:01:16 (UTC)
Goto Top
Zitat von @Crashzero:

Bei dem PS erhalte ich in I:\Daten\test nach wie vor die komplette Verzeichnisstruktur mit Leerverzeichnissen.
Nö, funktioniert hier einwandfrei, dann sind deine Verzeichnisse wohl doch nicht ganz leer ( haben versteckte Dateien).
Willst du versteckte Dateien ignorieren musst du den -Force Parameter bei Get-Childitem weglassen denn der bezieht versteckte Dateien mit ein.
Works as designed ...
Member: Crashzero
Crashzero Dec 29, 2021 updated at 13:20:14 (UTC)
Goto Top
Hmmm, die Verzeichnisse sind leer außer das dort wieder ein leeres Verzeichnis liegt.
Die obrige Struktur ist da wohl eher irreführend daher nochmal
Ordner1(Leer)
|_____Ordner2(Leer)
|____Ordner3(Leer)
|____Ev. noch mehr leer Ordner
|____Ordner X (Gefüllt mit Daten)

Ordner X soll dan mit den Datein in I:\Daten\test liegen

Ich gehe davon aus (Arbeite mit Totalcommander daher kann ich sicher sagen das dort keine Dateien, lediglich wieder leere Unter-Verzeichnisse) liegen.

Nun verstehe ich auch die Robocopy-Antwort, türlich habe ich die Hilfe gelesen, bringe nur die Parameter nicht zusammen das dies obige möglich wird.

..."Alles kopieren inklusive leerer Verzeichnisse.
Danach alle verzeichniss löschen (rd verzeichnis ohne /s /q). Dabei werden dann nur leere Verzeichnisse gelöscht."...

Jo, das würde bei der "flachen" Ordner-Hierarchie (Ordner auf eine Tiefenebene) funktionieren, aber nicht bei tiefer verschachteleten wie o.g.

Ah, ich hab gesehen das mein Einrücken der Ordnerstruktur nicht angezeigt wird, ich hänge mal ein Bild an.

(So kann es zu solchen Mißverständnissen führen)
Member: Crashzero
Crashzero Dec 29, 2021 at 13:21:25 (UTC)
Goto Top
ordner
Ordnerstruktur
Mitglied: 149569
Solution 149569 Dec 29, 2021 updated at 13:48:45 (UTC)
Goto Top
(So kann es zu solchen Mißverständnissen führen)
Erst einmal: Ein Ordner der andere Ordner/Dateien egal welcher tiefe enthält ist per Definition auch nicht leer!

Wenn du das so haben willst wie im letzten Post angegeben reicht
$quelle = "I:\Daten\StoreTemp"  
$ziel = 'I:\Daten\test'  
Get-ChildItem $quelle -Directory -Recurse | ?{$_.GetFiles().Count -gt 0} | copy-item -Destination $ziel -recurse -force
Dir sollte dabei aber klar sein das es hierbei auch evt. mehrere identische Ordner geben könnte.

Du siehst, exakte Definition ist hier sehr wichtig. Bitte das nächste mal berücksichtigen.
Member: Crashzero
Crashzero Dec 29, 2021 at 13:48:26 (UTC)
Goto Top
Soweit klappts, allerdings sind die Dateien nicht mitgekommen .... Nur das korrekte, leere, Verzeichnis ist im Zielordner vorhanden.
Mitglied: 149569
149569 Dec 29, 2021 updated at 13:49:26 (UTC)
Goto Top
Zitat von @Crashzero:

Soweit klapp, allerdings sind die Dateien nicht mitgekommen .... Nur das korrekte, leere, Verzeichnis ist im Zielordner vorhanden.
Du warst zu schnell, hatte kurz korrigiert, nochmal nehmen.
Member: Crashzero
Crashzero Dec 29, 2021 at 13:56:29 (UTC)
Goto Top
1A, läuft.
Ich danke dir.