PowerShell Ordner erstellen und Datei kopieren für Archiv

Cassius1985

Captain
Registriert
Sep. 2004
Beiträge
3.606
Hi Leute,

ich habe die Tage etwas dummes getan, leider ist mir das erst heute aufgefallen.
Ich habe einen Ordner in meiner Archiv-Struktur gelöscht, dieser Ordner wurde auch aus dem Backup entfernt :)

Es sind keine Daten verloren gegangen, ich habe jetzt allerdings beim Einspielen von den Daten ein Problem wenn besagter Ordner mit Datei darin nicht existiert.

Ich habe eine Scriptvorlage in PowerShell, aber komme mit PowerShell nicht wirklich zurecht, ich kann nur ein wenig VBA...

Was muss gemacht werden?
- Alle Unterordner im Stammordner durchsuchen und folgendes durchführen:

kopieren von: D:\Daten\xxxxx\Detail\01 bis 13.jpg
nach: D:\Daten\xxxxx\Spinner\Export

sowie

kopieren von: D:\Daten\xxxxx\Detail\14.jpg
nach: D:\Daten\xxxxx\Spinner\Export2

xxxxx sind Zahlen/Buchstabenkombinationen die variabel sind, aber das Script soll alle Ordner bearbeiten.
der Ordner Export(2) ist dabei nicht vorhanden und muss im Verzeichniss "Spinner" erstellt werden.

Als Vorlage habe ich das hier:

Code:
$root = "D:\Daten"

ForEach ($dir in (Get-Item -Path "$root\*\" | ?{$_.PSIsContainer})){
        Write-Host "Working on" $dir
        $files = Get-ChildItem "$root\*\*\*"
        Get-ChildItem $files | Move-Item -Destination { $_.Directory.Parent.FullName }
      }

Dieses Script wurde benutzt um die Datenstruktur auf einen Ordner zu reduzieren und spricht einfach jedes Verzeichniss in einem Ordner an.

Währe klasse wenn mir da jemand helfen könnte :)
 
Cassius1985 schrieb:
Was muss gemacht werden?
- Alle Unterordner im Stammordner durchsuchen und folgendes durchführen:

kopieren von: D:\Daten\xxxxx\Detail\01 bis 13.jpg
nach: D:\Daten\xxxxx\Spinner\Export
1. kopieren oder verschieben? - Dein Beispielscript verschiebt
2. gibt es nur Datein die 01.jpg usw. heisen oder noch andere?
Cassius1985 schrieb:
sowie

kopieren von: D:\Daten\xxxxx\Detail\14.jpg
nach: D:\Daten\xxxxx\Spinner\Export2
geht es mit Export2 und Export3 dann so weiter?
Cassius1985 schrieb:
xxxxx sind Zahlen/Buchstabenkombinationen die variabel sind, aber das Script soll alle Ordner bearbeiten.
der Ordner Export(2) ist dabei nicht vorhanden und muss im Verzeichniss "Spinner" erstellt werden.
Aber die Anzahl der Ordnerebenen bleibt immer gleich?
Was passiert mit dem Ordner Detail?
PowerShell:
$quellpfad = Get-childitem "c:\Test" -Recurse -Include "*.jpg"
Foreach ($datei in $quellpfad){
    [string]$export = (join-path (split-path $datei.directory) "Spinner\Export")
    [string]$export2 = (join-path (split-path $datei.directory) "Spinner\Export2")
    IF ($datei.basename -notmatch "14"){
        IF (!(Test-Path $export)){
            New-Item -ItemType directory -Path $export
            }
        Copy-Item $datei -Destination $export
    } ELSE {
        IF (!(Test-Path $export2)){
            New-Item -ItemType directory -Path $export2
            }
        Copy-Item $datei -Destination $export2
    }
}
Erster Code
!!!Bitte NUR mit Kopien in einem separatem Verzeichnis testen!!!!
 
Leider musste ich eben feststellen, dass noch mehr Dateien fehlen... Ich bekomm ne Krise...

Folgendes müsste KOPIERT werden:

Von:

D:\Daten\xxxxx\Spinner\xxxxx_A_01.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_03.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_08.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_21.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_31.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_35.jpg

Nach:

D:\Daten\Spinner\Export

und:

D:\Daten\Detail\14.jpg

Nach:

D:\Daten\Spinner\Export2

Das Problem hier wird wohl sein, dass der Ordnername "xxxxx" auch im Dateinamen der Dateien des Spinner-Ordners ist :/
Die restlichen Dateien im Ordner Detail und Spinner können dort bleiben.
Die Ordnerebenen sind immer gleich, es ändert sich nur der Name.

Danke !!
 
1. Jetzt bin ich verwirrt im 1. Post hast du geschrieben
kopieren von: D:\Daten\xxxxx\Detail\01 bis 13.jpg nach: D:\Daten\xxxxx\Spinner\Export
jetzt schreibst du
Nach: D:\Daten\Spinner\Export
fällt der XXXXX somit weg?

2. stimmen die Dateinamen xxxxx_A_01.jpg oder gibts da auch wieder ausnahmen, wenn nein ist das kein Problem.
 
PowerShell:
$pfad = "c:\Test"

$datein = Get-childitem $pfad -Recurse -Include "*.jpg"
[string]$export = Join-Path $pfad "Spinner\Export"
[string]$export2 = Join-Path $pfad "Spinner\Export2"

IF (!(Test-Path $export)){
            New-Item -ItemType directory -Path $export
            }
IF (!(Test-Path $export2)){
            New-Item -ItemType directory -Path $export2
            }         

Foreach ($datei in $datein){
    IF ($datei.basename -notlike "*_14"){
        Copy-Item $datei -Destination $export
    } ELSE {
        IF (!(Test-Path $export2)){
            New-Item -ItemType directory -Path $export2
            }
        Copy-Item $datei -Destination $export2
    }
}
Zweiter Code
!!!Bitte NUR mit Kopien in einem separatem Verzeichnis testen!!!!

@Cassius1985
Das Script kopiert alle JPG Dateien nach D:\Spinner\Export, je nach dem ob es am Ende auf _14 endet oder nicht.
 
Also für mich stellt sich hier die Frage:
Sollen nur die JPG-Dateien mit dem Suffix "_14" nicht ins Verzeichnis "Spinner\Export" kopiert werden oder gibt es noch detaillierte Bedingungen?

Weil dein initialer Beitrag und deine Nachträge sind widersprüchlich:
HIER:Kopiere 1-13 nach \Spinner\Export
und 14 nach \Spinner\Export2
Cassius1985 schrieb:
Was muss gemacht werden?
- Alle Unterordner im Stammordner durchsuchen und folgendes durchführen:

kopieren von: D:\Daten\xxxxx\Detail\01 bis 13.jpg
nach: D:\Daten\xxxxx\Spinner\Export

sowie

kopieren von: D:\Daten\xxxxx\Detail\14.jpg
nach: D:\Daten\xxxxx\Spinner\Export2
HIER:Kopiere 1-13 und 15-35 (oder Open-End) nach \Spinner\Export
und 14 nach \Spinner\Export2
Cassius1985 schrieb:
Von:

D:\Daten\xxxxx\Spinner\xxxxx_A_01.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_03.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_08.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_21.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_31.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_35.jpg

Nach:

D:\Daten\Spinner\Export

und:

D:\Daten\Detail\14.jpg

Nach:
HIER:Restliche Dateien????
Sind das die ab "_15"??
D:\Daten\Spinner\Export2
Cassius1985 schrieb:
Die restlichen Dateien im Ordner Detail und Spinner können dort bleiben.
Die Ordnerebenen sind immer gleich, es ändert sich nur der Name.


Wie dem auch sei, laut Ansatz sollte hier eventuell ein RegexMatch her (Regex =Regular Expression -> Regulärer Ausdruck).
Recurse mit Get-ChildItem und einem Wildcard-Match auf "*.jpg"filtert nicht auf den Ordner "Detail", sollte es zur Anforderung gehören und Thumbnails, nicht relevante Bilder, etc. in anderen Unterordnern existieren.

Nichts für Ungut @sikarr. Dein Ansatz funktioniert und deckt auch alles ab.
Sorry (da bin ich leider oft zu detailgetreu) ;)
Wenn es natürlich so passt, ohne Rücksicht auf Parent-Ordner, dann nehm ich alles zurück.
 
Zuletzt bearbeitet:
DPXone schrieb:
Nichts für Ungut @sikarr. Dein Ansatz funktioniert und deckt auch alles ab.
Sorry (da bin ich leider oft zu detailgetreu) ;)
Wenn es natürlich so passt, ohne Rücksicht auf Parent-Ordner, dann nehm ich alles zurück.
Ich weis nicht ob es so passt, er hat sich seither ja nicht mehr gemeldet, das hab ich in meiner Pause zusammen geklimpert, hab gerade auch noch nen Fehler gefunden :D.
DPXone schrieb:
Recurse mit Get-ChildItem und einem Wildcard-Match auf "*.jpg"filtert nicht auf den Ordner "Detail", sollte es zur Anforderung gehören und Thumbnails, nicht relevante Bilder, etc. in anderen Unterordnern existieren.
hmm das hab ich gar nicht bedacht, ist aber ein berechtigter Einwand. Kommt aber auch darauf an was er als Quellordner für GCI definiert. Ich bin davon ausgegangen das er den Detailordner als Quelle nimmt.
 
Hey, bin noch da, nur aktuell... etwas im Stress dank Corona...

Aktuell ist nicht sicher, ob ich wirklich alle bestehenden Datensätze brauche, daher habe ich etwas Zeit zum Testen und basteln. Was schonmal gut ist.

Hier nochmal, was genau und wohin kopiert werden müsste:

Folgende Bilder:

D:\Daten\xxxxx\Spinner\xxxxx_A_01.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_03.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_08.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_21.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_31.jpg
D:\Daten\xxxxx\Spinner\xxxxx_A_35.jpg

nach

D:\Daten\xxxxx\Spinner\Export

Dann

D:\Daten\xxxxx\Detail\B_14.jpg

nach

D:\Daten\xxxxx\Spinner\Export2


Nicht mehr und auch nicht weniger.

xxxxx ist dabei der Ordnername des Objektes, dieser variiert aus Zahlen/Buchstabenkombinationen mit 15-18 Zeichen. Aktuell habe ich ca. 1200 Objekte im Archiv, die angepasst werden müssten.

Hoffe dass es so verständlicher ist.
Testen werde ich natürlich mit Testdaten, bzw. in einer VM um ganz sicher zu gehen.

Danke vielmals!
 
Zuletzt bearbeitet:
Cassius1985 schrieb:
Hoffe dass es so verständlicher ist.
Eigentlich nicht.
Ich fasse mal zusammen. Alles was NICHT "_14.jpg" heist soll aus ".\Spinner" in einen Ordner ".\Spinner\Export" auf der selben Ordnerebene, alles was "_14.jpg" in ".\xxxxx\Detail" heist soll nach ".\Spinner\Export2"?

Sind für mich 2 getrennte Aufgaben, zu 1) betrifft das nur explizit die gelisteten Namen oder sind das nur Beispiele?
 
Ich habe mal Bilder gemacht...

Das ist der Inhalt der Ordner:

Inhalt Ordner.png


Das xxxxx steht hier für eine x-beliebige Zahlen/Buchstaben Kombination.
Im Ordner Detail sind 14 Bilder, im Ordner Spinner sind 108 Bilder. Sonst keine Unterordner mehr!

Jetzt soll das ganze so umgebaut werden, links der IST zustand, rechts der SOLL zustand:

Ordner Übersicht.png


Der Inhalt Ordner export:
Diese 6 Bilder sind aus dem Ordner Spinner

Inhalt Ordner export.png


und export2:
Dieses Bild ist aus dem Ordner Detail

Inhalt Ordner export2.png



Aktuell bearbeite ich einen Großteil manuell :/
 

Anhänge

  • Ordner Übersicht.png
    Ordner Übersicht.png
    167,6 KB · Aufrufe: 343
  • Inhalt Ordner export.png
    Inhalt Ordner export.png
    8,9 KB · Aufrufe: 386
PowerShell:
$startpfad = "C:\Test\Daten" #Startpfad sollte dein Datenverzeichnis sein

$spinner = Get-childitem $startpfad -Recurse -Include "*.jpg" | Where {$_.directory -match "Spinner" -and $_.name -notmatch "_14.jpg"} # erstellen Dateiliste für EXPORT, nur jpg.

# Für jede Datei aus der Liste EXPORT wird geprüft ob das Verzeichnis EXPORT existiert, falls nicht wird es angelegt.
# Danach wir die Datei kopiert.

Foreach ($datei in $spinner){
    [string]$export = (split-path $datei.Directory) + "\Export"
    If (!(Test-path $export)){
        New-Item -ItemType Directory -Path $export
        }
    copy-item $datei.FullName $export
}

$detail = Get-childitem $startpfad -Recurse -Include "*.jpg" | Where {$_.directory -match "Detail" -and $_.name -match "_14.jpg"} # erstellen Dateiliste für EXPORTR2, nur jpg

# Für jede Datei aus der Liste EXPORT wird geprüft ob das Verzeichnis EXPORT2 existiert, falls nicht wird es angelegt.
# Danach wir die Datei kopiert.
Foreach ($datei in $detail){
    [string]$export2 = (split-path $datei.Directory) + "\Export2"
    If (!(Test-path $export2)){
        New-Item -ItemType Directory -Path $export2
        }
    copy-item $datei.FullName $export2
}
Dann probier das mal

COPY-ITEM überschreibt existierende Dateien ohne Rückfrage, das sollte dir bewusst sein.
 
Cassius1985 schrieb:
Aber so wie ich das lese erstellt das Script eine Liste mit allen jpg des Spinner ordner, ich brauche aber nur die 6 beschriebenen jpgs...
ah, OK.

PowerShell:
$startpfad = "C:\Test\Daten" #Startpfad sollte dein Datenverzeichnis sein

$spinner = Get-childitem $startpfad -Recurse -Include "*.jpg" | Where {$_.directory -match "Spinner" -and $_.name -match "_01.jpg|_03.jpg|_08.jpg|_21.jpg|_31.jpg|_35.jpg"} # erstellen Dateiliste für EXPORT, nur jpg.

# Für jede Datei aus der Liste EXPORT wird geprüft ob das Verzeichnis EXPORT existiert, falls nicht wird es angelegt.
# Danach wir die Datei kopiert.

Foreach ($datei in $spinner){
    [string]$export = (split-path $datei.Directory) + "\Export"
    If (!(Test-path $export)){
        New-Item -ItemType Directory -Path $export
        }
    copy-item $datei.FullName $export
}

$detail = Get-childitem $startpfad -Recurse -Include "*.jpg" | Where {$_.directory -match "Detail" -and $_.name -match "_14.jpg"} # erstellen Dateiliste für EXPORTR2, nur jpg

# Für jede Datei aus der Liste EXPORT wird geprüft ob das Verzeichnis EXPORT2 existiert, falls nicht wird es angelegt.
# Danach wir die Datei kopiert.
Foreach ($datei in $detail){
    [string]$export2 = (split-path $datei.Directory) + "\Export2"
    If (!(Test-path $export2)){
        New-Item -ItemType Directory -Path $export2
        }
    copy-item $datei.FullName $export2
}
Ist geändert.
 
Zurück
Oben