marabunta
Goto Top

Powershell Solo-Ordner eine Ebene verschieben

Hallo,

In einer riesigen Ordnerstruktur, möchte ich ab Unterordner 2, alle Folgenden Unterordner, die auf der selben Ebene keine Dateien haben, eine Ebene hoch schieben.
Sodass, ab Unterordner 2, entweder

Variante 1 OK Ordner mit Dateien darin + Dateien auf gleicher Ebene:
PFAD\OrdnerA\OrdnerB\DateienA &
PFAD\OrdnerA\DateienB

Variante 2 OK Keine Ordner, aber Dateien:
PFAD\DateienA ohne weitere Ordner

Variante 3 NICHT OK Unterordner mit Dateien darin, aber keine Dateien auf gleicher Ebene:
PFAD\OrdnerA\OrdnerB\DateienA

Variante 4 Prüfen(rausschreiben) mehr als 1 Unterordner mit Dateien darin, aber keine Dateien auf gleicher Ebene:
PFAD\OrdnerA\OrdnerB\DateienA &
PFAD\OrdnerA\OrdnerC\DateienB

Also keine Solo-Ordner alleine ohne Dateien auf gleicher Ebene nach Ordner A, der Inhalt soll in diesem Fall eine Ebene hoch:
PFAD\OrdnerA\DateienA

Ich habe noch keine Vorschläge dazu gefunden und kann es mir bisher nicht in simplem Code vorstellen.

Danke für Vorschläge.

Content-ID: 667328

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

Ausgedruckt am: 24.11.2024 um 03:11 Uhr

H41mSh1C0R
H41mSh1C0R 05.06.2021 um 11:12:39 Uhr
Goto Top
Zitat von @Marabunta:
Ich habe noch keine Vorschläge dazu gefunden und kann es mir bisher nicht in simplem Code vorstellen.

Hi,

für spezifische Probleme gibt es selten die fertige Umsetzung.

Zerlege deine Aufgabe in einfache Schritte.

- wie prüfe ich ob ein Ordner vorhanden und leer ist?
- wie verschiebe ich Dateien?
- wo kommen Schleifen zum Einsatz?
- wo wird Rekursion benötigt?

- wie würde ich es in Einzelschritten machen? --> Programm Ablauf Plan
- oder mit freien Worten

Daraus dann ableiten wo Schleifen, Rekursion, Hilfsvariablen etc. zum Einsatz kommen und los bauen.

VG
mayho33
mayho33 05.06.2021 aktualisiert um 20:45:10 Uhr
Goto Top
Schau dir mal System.IO.Directory.GetDirectories an.

Hir ein kleiner Denkanstoß:
https://stackoverflow.com/questions/14970692/powershell-io-directory-fin ...

Alles andere hat H41mSh1C0R schon geschrieben.


Files und Folder verschieben geht mit Move-Item.

https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Aber besser du würdest Robocopy verwenden. Das kann nämlich auch ShadowCopy und bricht nicht ab bei Zugriffsproblemen. Außerdem schon onBoard:

https://docs.microsoft.com/en-us/windows-server/administration/windows-c ...


Grüße!
colinardo
Lösung colinardo 09.06.2021 um 09:55:46 Uhr
Goto Top
Servus.
Mal was für dich als Grundlage auf der du aufbauen kannst soweit ich das verstanden habe
$root = 'D:\Pfad'  
ls $root -Directory | ?{!(ls $_.FullName -File)} | %{
    if ((ls $_.FullName -Directory).Count -ge 2){
        write-host "Ordner '$($_.Fullname)' hat mehr als einen Unterordner." -F Yellow  
    }else{
        ls "$($_.FullName)\*\*" -File | move-item -Destination $_.FullName -Verbose  
    }
}
Grüße Uwe
Marabunta
Marabunta 09.06.2021 um 10:37:07 Uhr
Goto Top
Hi,

Danke.
Ich habe bereits etwas gebastelt und ein funktionales Skript hinbekommen, nicht optimiert und langsam.

$BasePath=("D:\")  
$BasePath |%{
    $BaseChild=gci $_ | Where-Object {($_.PSIsContainer)} 
    GCI $BaseChild -Recurse | Where-Object {($_.PSIsContainer)} |%{
        $ChildFolder=$_.FullName
        if(!((GCI $ChildFolder) | Where-Object {!($_.PSIsContainer)})){
            $OrdnerohneDateien=$_.FullName
            #Write-Host "$OrdnerohneDateien Es gibt keine Dateien" 
        
            (Get-Item $OrdnerohneDateien)| Where-Object {($_.PSIsContainer)} |%{
            
                $thisfolder=$_.Fullname
                #Write-Host "checking $thisfolder" 
                if(((GCI $thisFolder)| Where-Object {($_.PSIsContainer)}).count -eq 1){
                    #Write-Host "Thisfolder: $thisfolder has 1 Subfolder" 
                    $movefrom=gci $thisFolder |select -ExpandProperty fullname
                    $moveto=(get-item $thisfolder ).parent.FullName
                    if(!((get-item $movefrom).Basename -eq (get-item $thisfolder).Basename)){
                        Move-Item $movefrom $moveto -force
                    }else{
                        $newfolder=(get-item $thisfolder).Basename +"1"  
                        Move-Item $movefrom $($moveto+"\$newfolder") -force  
                    }
                }
            }
        }
    }
}