functionstrut
Goto Top

Anhand Ordnernamen Ordner suchen und löschen

Hallo,

ich habe mal eine etwas (in meinen augen) besondere Aufgabe.

und zwar folgende Ordnerstruktur ist vorhanden:


./Haus/Maus/Baum/Foto1 fehlt
./Haus/Maus/Baum/Foto1
./Haus/Maus/Busch/Foto1 fehlt
./Haus/Maus/Birke/Foto1 fehlt
./Haus/Maus/..../Foto1 fehlt

ich möchte jetzt ein script (egal ob batch oder powershell) das alle Order nach einem "Foto1" durchsucht. Wenn er dann "./Haus/Maus/Baum/Foto1" findet soll er überprüfen ob "./Haus/Maus/Baum/Foto1 fehlt" exisitert und dann diesen ordner löschen.

Es handelt sich bei "Foto1" bzw "Foto1 fehlt" immer um ORDNER.

Content-Key: 300857

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

Ausgedruckt am: 19.03.2024 um 11:03 Uhr

Mitglied: 114757
114757 04.04.2016 aktualisiert um 17:54:53 Uhr
Goto Top
Powershell
gci 'C:\Ordner' -Filter 'Foto1 fehlt' -recurse | ?{$_.PSIsContainer -and (Test-Path "$($_.Parent.Fullname)\Foto1")} | remove-item -Force -Recurse  
Batch
for /f "delims=" %%a in ('dir /b /s /AD "C:\Ordner" ^| findstr /iec:"\\Foto1" 2^>nul') do (  
    if exist "%%~dpaFoto1 fehlt" rd "%%~dpaFoto1 fehlt" /s /q  
)
Gruß jodel32
Mitglied: functionstrut
functionstrut 04.04.2016 um 12:25:10 Uhr
Goto Top
Hallo vielen Dank

Aber so richtig funktioniert das noch nicht. er löscht jetzt auch den ordner "Foto1 fehlt" wenn KEIN ordner "Foto1" vorhanden ist. Er soll den Ordner "Foto1 fehlt" aber nur dann löschen wenn "Foto1" existiert. bei deinem Script/zeile löscht er alle
Mitglied: 114757
114757 04.04.2016 aktualisiert um 12:36:25 Uhr
Goto Top
Ach so sorry ist oben angepasst...
Mitglied: functionstrut
functionstrut 04.04.2016 um 13:20:28 Uhr
Goto Top
Vielen Dank. Habe deine neue Powershellzeile probiert aber mit dieser tut sich jetzt gar nichts. Er löscht gar keinen ordner

hast du eine idee?
Mitglied: 114757
114757 04.04.2016 aktualisiert um 13:27:31 Uhr
Goto Top
Kleiner Typo im PS Skript, ist oben korrigiert.
Mitglied: functionstrut
functionstrut 04.04.2016 um 14:03:56 Uhr
Goto Top
es tut mir wirklich leid aber irgendwie passiert noch immer nichts face-confused
Mitglied: 114757
114757 04.04.2016 aktualisiert um 14:18:01 Uhr
Goto Top
Geht hier einwandfrei! Die "Executionpolicy" hast du aber schon freigeschaltet ?
Zur Info: Bei den Skripten wird nichts ausgegeben nur gelöscht.
Der Fehler muss bei dir und deiner Anpassung liegen.
Mitglied: functionstrut
functionstrut 04.04.2016 um 14:38:42 Uhr
Goto Top
ja klar, andere powershellscripte funktionieren bei mir.
ich habe nach dem ausführen (über "Play" im Powershelleditor) immer den Ordner überprüft ob die dementsprechenden Ordner gelöscht wurden.
Mitglied: 114757
114757 04.04.2016 aktualisiert um 14:51:06 Uhr
Goto Top
Hast du deine PS up to date? Min. PS 3.0. Habe es hier mit deiner Ordnerstruktur einwandfrei getestet. Sowohl das PS Skript als auch das Batch machen alles genau wie du es beschrieben hast. Die Skripte sind ja nun wirklich keine Herausforderung face-smile. Alles Kinderkram.

Das du das 'C:\Ordner' an deine Umgebung anpassen musst, sollte klar sein.
Mitglied: functionstrut
functionstrut 04.04.2016 aktualisiert um 16:09:59 Uhr
Goto Top
Habe version 5.0.xxxxxx (get-host)
den Pfad habe ich natürlich auch angepasst face-smile den ersten befehl den du gepostet hatte, der hatte ja funktioniert aber nur nicht richtig. das ist ja das komische...

wieso hast du den Pfad in ' ' und nicht in " "?

EDIT: Die Batch funktioniert. Wieso aber die powershell nicht?

edit:in der Batch funktioniert es mit "Staffel 2" und "Staffel 2 fehlt" nicht. wenn ich wie im beispiel angegeben mit Foto1 probiere funktioniert es
Mitglied: 114757
Lösung 114757 04.04.2016 aktualisiert um 17:59:30 Uhr
Goto Top
Zitat von @functionstrut:
wieso hast du den Pfad in ' ' und nicht in " "?
Weil in einfachen Hochkommas eventuelle Sonderzeichen durch die PS nicht expandiert werden! Das ist best Practice wenn man keine Variablen einbauen möchte.
EDIT: Die Batch funktioniert. Wieso aber die powershell nicht?
Keine Ahnung. Läuft hier wie gesagt einwandfrei.

Alternativ kann man es auch so schreiben
gci 'C:\Ordner' -recurse -Directory | ?{ $_.Name -eq 'Foto1 fehlt' -and (Test-Path "$($_.Parent.Fullname)\Foto1")} | remove-item -Force -Recurse  
Das lüppt ebenfalls problemlos, mach ich ja Tag für Tag min Jung!!

Entweder hast du es hier nicht korrekt beschrieben oder etwas was ich hier nicht sehen kann macht du falsch, sorry!
Mitglied: functionstrut
functionstrut 05.04.2016 um 09:35:18 Uhr
Goto Top
jetzt funktioniert es mit dem neuen code von dir face-smile keine Ahnung wieso der von oben nicht funktioniert?!
Vielen Dank dafür schonmal! face-smile

Wäre es auch möglich das ganze in eine Schleife zu stecken? also das er diesen powershellcode für Foto1 bis Foto20 zum beispiel ausführt?
Mitglied: 114757
Lösung 114757 05.04.2016 aktualisiert um 09:52:06 Uhr
Goto Top
Zitat von @functionstrut:
Wäre es auch möglich das ganze in eine Schleife zu stecken? also das er diesen powershellcode für Foto1 bis Foto20 zum beispiel ausführt?
Logisch
$folders = gci 'C:\Ordner' -recurse -Directory  
1..20 | %{
    $num = $_
    $folders | ?{ $_.Name -eq "Foto$num fehlt" -and (Test-Path "$($_.Parent.Fullname)\Foto$num")} | remove-item -Force -Recurse  
}
Mitglied: functionstrut
functionstrut 05.04.2016 um 11:49:22 Uhr
Goto Top
Hammer face-smile funktioniert super!

und gibt es auch eine möglichkeit folgendes abzufragen?:
ob KEIN "Foto1 fehlt" Ordner existiert
ABER zusätzlich ein Ordner "FotosFinish" existiert

wenn das zutrifft soll er einen ordner mit dem namen "Fotos alle da" erstellen

geht das?
Mitglied: 114757
114757 05.04.2016 aktualisiert um 12:01:38 Uhr
Goto Top
Wars das jetzt, Monsieur?... das ist hier ja kein Wunschkonzert.
$folders = gci 'C:\Ordner' -recurse -Directory  
1..20 | %{
    $num = $_
    $folders | %{
        if ($_.Name -eq "Foto$num fehlt" -and (Test-Path "$($_.Parent.Fullname)\Foto$num")){  
            remove-item $_ -Force -Recurse
        }
        if ($_.Name -eq 'FotoFinish' -and !(Test-Path "$($_.Parent.Fullname)\Foto$num fehlt")){  
            md "$($_.Parent.Fullname)\Fotos alle da"  
        }
    }
}
Please read now!
Mitglied: functionstrut
functionstrut 06.04.2016 aktualisiert um 17:56:36 Uhr
Goto Top
Einen Wunsch hätt ich noch face-smile
ich habs zwar selber probiert aber so wirklich funktioniert es nicht. Er soll zusätzlich wenn "FotosFinish" und "Foto1 fehlt" existiert wieder den Ordner "Fotos alle da" löschen.

PS. funktioniert übrigens super
Mitglied: 114757
Lösung 114757 06.04.2016 um 20:20:19 Uhr
Goto Top
Zitat von @functionstrut:

Einen Wunsch hätt ich noch face-smile
ich habs zwar selber probiert aber so wirklich funktioniert es nicht. Er soll zusätzlich wenn "FotosFinish" und "Foto1 fehlt" existiert wieder den Ordner "Fotos alle da" löschen.

$folders = gci 'C:\Ordner' -recurse -Directory  
1..20 | %{
    $num = $_
    $folders | %{
        if ($_.Name -eq "Foto$num fehlt" -and (Test-Path "$($_.Parent.Fullname)\Foto$num")){  
            remove-item $_ -Force -Recurse
        }
        if ($_.Name -eq 'FotoFinish' -and !(Test-Path "$($_.Parent.Fullname)\Foto$num fehlt")){  
            md "$($_.Parent.Fullname)\Fotos alle da"  
        }
        if ($_.Name -eq 'FotoFinish' -and (Test-Path "$($_.Parent.Fullname)\Foto$num fehlt")){  
            remove-item "$($_.Parent.Fullname)\Fotos alle da" -Force -Recurse  
        }
    }
}
Mitglied: functionstrut
functionstrut 14.04.2016 aktualisiert um 17:17:28 Uhr
Goto Top
in der zweiten Zeile/Funktion wo er den Ordner "Fotos alle da" erstellt, müsste es so sein das er diesen Ordner NUR dann erstellt wenn die Ordner "Foto1" bis "Foto20" exisitiert. ist das möglich? Denn im moment wird der Ordner ja auch erstellt wenn beispielsweise nur Foto1 und Foto19 vorhanden ist.

bestimmt irgendwie mit einer hash-table die bei jedem durchlauf die zahl ändert oder?
Mitglied: 114757
Lösung 114757 14.04.2016 aktualisiert um 17:57:35 Uhr
Goto Top
So, das war jetzt die allerletzte kostenlose Anpassung von meiner Seite.... tröpfel, tröpfel ...wat kommt noch face-sad
        # ......
        $parent = $_.Parent.Fullname
        if ($_.Name -eq 'FotoFinish' -and ((1..20 | ?{Test-Path "$parent\Foto$_"}).Count -eq 20 )){  
            md "$parent\Fotos alle da"  
        }
       #........
Wie wärs mal vor dem Anfangen alle Bedingungen festzulegen ??? Anstatt hinterher immer wieder alles umzuwerfen...