micha1878
Goto Top

Powershell Ordner mit Zeichen umbenennen

Hallo zusammen,

ich habe ein Script geschrieben die die Verzeichnisse nach leeren Ordnern durchsucht und löscht. Das Problem ist, aber, dass die Struktur verändert wird.
Ich möchte nun, dass die Ordner die leer sind, ein # vorne bekommen z.B. #Ordner1.
Und kann ich zum Beispiel auf die Tiefe begrenzen? Nur zum Beispiel zwei Ebenen?

Vielen Dank
Grüße
Micha

Content-ID: 1122220891

Url: https://administrator.de/forum/powershell-ordner-mit-zeichen-umbenennen-1122220891.html

Ausgedruckt am: 22.04.2025 um 18:04 Uhr

149062
149062 04.08.2021, aktualisiert am 05.08.2021 um 09:30:16 Uhr
Goto Top
Und kann ich zum Beispiel auf die Tiefe begrenzen? Nur zum Beispiel zwei Ebenen?
Indem man die Doku liest:
Get-ChildItem
[-Depth <uint32>]

-Depth

This parameter was added in PowerShell 5.0 and enables you to control the depth of recursion. By default, Get-ChildItem displays the contents of the parent directory. The Depth parameter determines the number of subdirectory levels that are included in the recursion and displays the contents.

For example, Depth 2 includes the Path parameter's directory, first level of subdirectories, and second level of subdirectories. By default directory names and filenames are included in the output.  


gci 'F:\Ordner' -Directory -Depth 1 | ?{!(ls $_.FullName -Force)} | rename-item -NewName {"#$($_.Name)"} -Force  
erikro
erikro 04.08.2021 um 20:53:06 Uhr
Goto Top
Moin,

Zitat von @149062:

Und kann ich zum Beispiel auf die Tiefe begrenzen? Nur zum Beispiel zwei Ebenen?
Indem man die Doku liest:
Get-ChildItem

> gci 'F:\Ordner' -Directory -Depth 1 | ?{!(ls $_.FullName -Force -Recurse)} | sort {$_.FullName.length} -Desc | rename-item -NewName {"#$($_.Name)"} -Force  
> 

Aber dann mache es doch den Anfängern nicht immer so schwer und benutze keine Aliase und dann auch noch verschiedene für denselben Befehl. Für den TO: gci und ls sind Aliase für get-childitem und ? ist ein Alias für where-object.

Und rein interessehalber: Warum sortierst Du das Ergebnis vor dem Umbenennen?

Liebe Grüße

Erik
149062
149062 04.08.2021 aktualisiert um 21:06:55 Uhr
Goto Top
Und rein interessehalber: Warum sortierst Du das Ergebnis vor dem Umbenennen?
Da war ich in Gedanken parallel gerade bei einem anderen Projekt, ist hier überflüssig sorry. Das wäre nur relevant wenn nur Dateien in Ordnern beachtet werden müssen und nicht auch Unterordner denn sonst könnte unter Umständen ein Ordner einer höheren Ebene als erstes umbenannt werden woraufhin dann ein Umbenennen in einer unteren Ebene dieses Ordners fehlschlagen würde weil man den in der höheren Ebene bereits umbenannt hat.

Für den TO: gci und ls sind Aliase für get-childitem und ? ist ein Alias für where-object
Und ein get-alias zeigt ihm gleich alle Abkürzungen an ...
erikro
erikro 04.08.2021 um 21:16:01 Uhr
Goto Top
Zitat von @149062:

Und rein interessehalber: Warum sortierst Du das Ergebnis vor dem Umbenennen?
Da war ich in Gedanken parallel gerade bei einem anderen Projekt, ist hier überflüssig sorry.

Dann bin ich beruhigt. Ich habe mir ernsthaft Gedanken darüber gemacht, was der Sinn ist, und konnte keinen finden. face-wink

Und ein get-alias zeigt ihm gleich alle Abkürzungen an ...

Ja klar. Aber hilfreicher wäre es für die Lesbarkeit, die Befehle auszuschreiben. Selbst ich hatte bei gci und ls erstmal ganz kurz ein Fragezeichen im Gesicht. face-wink
TK1987
TK1987 05.08.2021 um 08:14:24 Uhr
Goto Top
Moin,

@149062 bitte auch noch das -recurse innerhalb von where-object entfernen, denn dass ist einfach nur ressourcenverschwendung.

Gruß Thomas

PS: Einzeiler sind für Anfänger auch nicht immer gerade hilfreich face-wink
micha1878
micha1878 06.08.2021 um 20:25:22 Uhr
Goto Top
Ich habe noch ei paar kleine Problemchen. Zu einem möchte ich, dass die Ordner nur mit einem # versehen werden egal wie oft ich das Script aufrufe, jetzt macht er #######Ordner. Und zweitens die Log Datei wird nicht erstellt wollte eigentlich die Ordner die mit einem # versehen wurden in eine Log Datei haben.

$path="C:\Test1\WBE"  

# LogDatei            
$LogDatei = "C:\Test1\LogOrdnerLoeschen.txt"  

$confirmation = Read-Host "Skript testen (t) oder ausführen (a)?"  

$GeloeschteOrdner = @()  
$Excl1 = "Beschaffung"  
$Excl2 = "Kamerasysteme"  
$Excl3 = "Kennwoerter"  
$Excl4 = "Maschinenabnahme"  
$Excl5 = "Qualitaet"  
$Excl6 = "Sicherheit"  
$Excl7 = "TPM"  
$Excl8 = "Umwelt"  
$Excl9 = "Zwischenablage"  
$Excl10 = "Software"  
$Excl11 = "TechnischeDokumentation"  

 $dirs = gci $path -directory -Recurse -Depth 1 -Exclude $Excl1, $Excl1, $Excl2, $Excl3, $Excl4, $Excl5, $Excl6, $Excl7, $Excl8, $Excl9, $Excl10, $Excl11 | Where { (gci $_.fullName).count -eq 0 } | Rename-Item -NewName {"#$($_.Name)"} -Force | ForEach-Object {   
    
    $main = $_.FullName.ToString().Substring($path.Length+1)
    $length = $main.ToString().IndexOf('\')  
    if ($length -ne -1) {
        $main = $main.ToString().Substring(0,$length) 
    }
    if ($main -match "^\d+$") {  
        if ( $_.FullName.ToString() -like '*TechnischeDokumentation*' -or $_.FullName.ToString() -like '*Software*')  
        
       {
        
            if (!$_.FullName.EndsWith('Software')) {   
                if (!$_.FullName.EndsWith('TechnischeDokumentation')) { "TechnischeDokumentation"  
                    if ($confirmation -eq 't') {  
                
                        Write-Host $_.FullName
                        $GeloeschteOrdner += $_.Fullname 
                    }
        
                    if ($confirmation -eq 'a') {  
                        #Remove-Item $_.FullName
                        Write-Host $_.FullName
                        $GeloeschteOrdner += $_.Fullname 
                    }    
                }
            }

        }
    }
}
Add-Content -Path $LogDatei -Value $dirs