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

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

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

Mitglied: 149062
149062 Aug 04, 2021, updated at Aug 05, 2021 at 07:30:16 (UTC)
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  
Member: erikro
erikro Aug 04, 2021 at 18:53:06 (UTC)
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
Mitglied: 149062
149062 Aug 04, 2021 updated at 19:06:55 (UTC)
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 ...
Member: erikro
erikro Aug 04, 2021 at 19:16:01 (UTC)
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
Member: TK1987
TK1987 Aug 05, 2021 at 06:14:24 (UTC)
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
Member: micha1878
micha1878 Aug 06, 2021 at 18:25:22 (UTC)
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