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-Key: 667328

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

Printed on: April 26, 2024 at 04:04 o'clock

Member: H41mSh1C0R
H41mSh1C0R Jun 05, 2021 at 09:12:39 (UTC)
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
Member: mayho33
mayho33 Jun 05, 2021 updated at 18:45:10 (UTC)
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!
Member: colinardo
Solution colinardo Jun 09, 2021 at 07:55:46 (UTC)
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
Member: Marabunta
Marabunta Jun 09, 2021 at 08:37:07 (UTC)
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  
                    }
                }
            }
        }
    }
}