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

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

Mitglied: 114757
114757 Apr 04, 2016 updated at 15:54:53 (UTC)
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
Member: functionstrut
functionstrut Apr 04, 2016 at 10:25:10 (UTC)
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 Apr 04, 2016 updated at 10:36:25 (UTC)
Goto Top
Ach so sorry ist oben angepasst...
Member: functionstrut
functionstrut Apr 04, 2016 at 11:20:28 (UTC)
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 Apr 04, 2016 updated at 11:27:31 (UTC)
Goto Top
Kleiner Typo im PS Skript, ist oben korrigiert.
Member: functionstrut
functionstrut Apr 04, 2016 at 12:03:56 (UTC)
Goto Top
es tut mir wirklich leid aber irgendwie passiert noch immer nichts face-confused
Mitglied: 114757
114757 Apr 04, 2016 updated at 12:18:01 (UTC)
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.
Member: functionstrut
functionstrut Apr 04, 2016 at 12:38:42 (UTC)
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 Apr 04, 2016 updated at 12:51:06 (UTC)
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.
Member: functionstrut
functionstrut Apr 04, 2016 updated at 14:09:59 (UTC)
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
Solution 114757 Apr 04, 2016 updated at 15:59:30 (UTC)
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!
Member: functionstrut
functionstrut Apr 05, 2016 at 07:35:18 (UTC)
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
Solution 114757 Apr 05, 2016 updated at 07:52:06 (UTC)
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  
}
Member: functionstrut
functionstrut Apr 05, 2016 at 09:49:22 (UTC)
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 Apr 05, 2016 updated at 10:01:38 (UTC)
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!
Member: functionstrut
functionstrut Apr 06, 2016 updated at 15:56:36 (UTC)
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
Solution 114757 Apr 06, 2016 at 18:20:19 (UTC)
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  
        }
    }
}
Member: functionstrut
functionstrut Apr 14, 2016 updated at 15:17:28 (UTC)
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
Solution 114757 Apr 14, 2016 updated at 15:57:35 (UTC)
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...