cmd batch für Löschung von files in einem Ordner?

3 Antworten

hohe Ansprüche für ein kleines del 😏

del hat leider keine Ausschlussbedingung.

aber man kann mit :

dir /a-d /b /s |findstr  /vir  /c:".cmd$"  /c:".lnk$" 

...kann man Dateien suchen , findstr filtert die Ergebnisse (dazu mehr in der Demobatch.

das folgende wirkt nur auf das Verzeichnis der Batch und darunter!

demo.cmd

@echo off
 rem wichtig,  damit  auch dateien mit UTf8 im Namen erwischt werden
chcp 65001 >nul
rem so stellt man sicher das die Batch dort arbeitet wo sie gespeichert ist!
rem Speicherort der Batch zum Arbeitsverzeichnis machen!
cd /d "%~dp0"


rem findstr /vir  = suche  nicht , ignorier groß-klein, regex. 
rem dann die auszuschliesenden Endungen  /c:".txt$"  = .txt mit nichts danach $ ist Zeilenende
rem  /c:"%~f0" ist dafür, das sich   die Batch  nicht selbst  erwischt und  so jede auszuschließende Sache  erwähnen...
::dir /a-d /b /s |findstr  /virc:"%~f0"  /c:".cmd$"  /c:".lnk$" 

 als Schleife...
for /f "tokens=*" %%a in ('dir /a-d /b /s ^|findstr  /vir /c:"%~f0"  /c:".cmd$"  /c:".lnk$" /c:".jpg$" ') do (
   rem zum scharf machen  entferne das echo vor dem del
  echo del "%%~a" 
)
pause


Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Erzesel  21.04.2022, 10:53

update: (hatte einen Fehler drin)

@echo off
chcp 65001 >nul
cd /d "%~dp0"
 rem war ein  Fehler  meinerseits:  damit sich   die batch  selbst  vor dem Löschen schützt:
set "self=%~f0"
 rem backslasches im filter verdoppeln
for /f "tokens=*" %%a in ('dir /a-d /b /s ^|findstr  /vir /c:"%self:\=\\%"  /c:".cmd$"  /c:".lnk$" /c:".jpg$" ') do (
  echo del "%%~a" 
)
pause
0
DarkPyramid 
Fragesteller
 22.04.2022, 22:14
@Erzesel

Ziemlich chaotisch. Ist mir etwas zu heikel, aber danke. Ich hab früher einige Batches gebastelt, aber ein falsches Zeichen und es löscht durch die Gegend wie ein schredder. . . .die doppelten Prozentzeichen brauche ich für .bat oder? . . nicht für .cmd.

0
Erzesel  23.04.2022, 08:52
@DarkPyramid
Ziemlich chaotisch. 

Das sieht nur so aus🤫

Gerade weil Du nicht durchblickst habe ich einen Haufen Kommentare und etwas "Sicherheit" eingebaut.

for /f-Loops sind das einzige Mittel das Ergebnis eines Kommandos an ein anderes weiterzuleiten... .aber daran scheitern sogar gestandene Administratoren.

Du wolltest eine selektive Methodik...

findstr... selektiert nunmal recht zuverlässig Ergebnisse anderer Befehle. Kommandozeilen für komplexe Anforderungen sind nie Hübsch. Etwas zu Definieren was nicht getan werden soll ist immer schwieriger als zu sagen was zu tun ist...

ein falsches Zeichen und es löscht durch die Gegend wie ein schredder

Darum wurden Bedienoberflächen wie Nortoncommander oder Explorer erfunden, damit man sieht was man auswählt. 😅

Und Leute wie ich probieren erstmal mit einem Echo vor einem zerstörenden Befehl worauf dieser wirkt. Darum habe ich auch noch einen Fehler im anfänglichen Script gefunden

die doppelten Prozentzeichen brauche ich für .bat oder? . . nicht für .cmd.

sowohl .bat als auch .cmd sind Batchdateien. (alles gleich bis aufs Errrormanagment🤮)

In beiden müssen %-Zeichen für Laufvariablen und für Texte verdoppelt werden...

Die Endung .bat sollte man (wegen des fehlerhaften Errormanagments) unter Windows nicht mehr verwenden! Keine Ahnung weshalb jeder Anfänger treudoof den seit 25 Jahren obsoleten Mist verwendet?

Einfache %-Zeichen gelden nur bei direkter Eingabe in ein Consol-Fenster...

0
DarkPyramid 
Fragesteller
 22.04.2022, 22:19

Verstehe nicht ganz warum man nicht mit den Attributen Dinge ausschließen kann. Irgendwie bescheuert. Wer will grundsätzlich absolut alles in einem Ordner löschen ? . . dann brauch ich ja nur rechtsklick-> Ordner löschen . . -.- . .

0
Erzesel  23.04.2022, 09:02
@DarkPyramid
Verstehe nicht ganz warum man nicht mit den Attributen Dinge ausschließen kann.

kann man...(habe ich nicht bestritten)

Das Problem dabei ist, dass das spätere Löschen der Attribute auch Attribute löscht , welche bei (vielleicht) einigen Dateien bereits vor dem setzen bestanden... (das sind Sachen welche man mit 35 Jahren Erfahrung auf dem Schirm hat)

Ich möchte wirklich nicht die Nummer mit den Umfärben von roten und grünen Äpfeln abziehen😱

0
DarkPyramid 
Fragesteller
 10.11.2022, 16:55
@Erzesel

for /f %%F in ('dir /b /a-d ^| findstr /vile ".png .jpg .gif .bmp .mp4 .mov .mpeg .avi .cmd"') do del "%%F"

So einfach wäre es gewesen wenn du es gewusst hättest . . ich wünschte die Leute die was können würden antworten -.-

0
Erzesel  10.11.2022, 17:32
@DarkPyramid

und was willst Du mir damit sagen?

ich wünschte die Leute die was können würden antworten -.-

ich denk schon, das ich's kann ... : https://www.gutefrage.net/frage/csv-daten-in-batch-anzeigen

Natürlich habe ich nicht für 1000e Befehle/Funktionen in diversen Programmiersprachen alle möglichen Parameter im Kopf. Sowas gibt's nur im Kino.

Normalerweise führe ich die Administrationsaufgaben in Powershell aus und programmiere gewöhnlich in C#.

Das ich für Deinesgleichen neben meinen übrigen Aufgaben etwas Hilfe biete ist mein guter Wille.

Schön, das es Dir in einem halben Jahr gelungen ist eine elegantere Lösung zu finden! Das gibt Dir jedoch nicht das Recht meine Kompetenz in Zweifel zu ziehen!!!

Erwartest Diu tatsächlich, das ich einem solchen Menschen weiter zur Seite stehe? Wenn Du so schlau bist löse Deinen Sch💩 gefälligst selbst. : https://www.gutefrage.net/frage/unterorder-in-batch-mit-einbeziehen

0
DarkPyramid 
Fragesteller
 10.11.2022, 17:37
@Erzesel

Genau das ist das Problem, dass Leute wie du denken sie sind so extrem wichtig, dass sie für uns Laien aus dem Himmel herabsteigen müssen und uns mit ihren überragenden Fähigkeiten beregnen.

Wenn ich nach nem Pfannkuchenrezept frage will ich kein Rezept für Lachsfilet. Dabei ist mir vollkommen egal ob du der beste Lachs-Zubereiter auf der Welt bist.

Es wird wohl noch millionen andere Programmierer geben. Und programmieren ist für mich so eine banale weitverbreitete Tätigkeit, dass ich was besseres zu tun habe.

Verwechsel nicht Mich-selbst-gerne-reden-hören mit Altruismus.

0
Erzesel  10.11.2022, 17:41
@DarkPyramid

lieber Schlaumeier

Dein for/f-loop scheitert, wenn Dateinamen Leerzeichen enthalten das sehe ich auf den ersten Blick

programmieren ist für mich so eine banale weitverbreitete Tätigkeit, dass ich was besseres zu tun habe

gut zu wissen, das Du Programmierer als Lakaien ansiehst...

0

Mach doch sowas nicht in Batch. In PowerShell ist das viel übersichtlicher. Ist auch bei Windows dabei:

# Ordner einstellen (alternativ kann das Script auch von dem Ordner aus 
# gestartet werden, in dem die Dateien liegen)
Set-Location C:\temp\test

# Alle Dateien in dem Ordner und allen Unterordnern ermitteln
$loeschliste = Get-ChildItem -Recurse -File

# Die Dateien, die bestehen bleiben sollen, aus der Löschliste entfernen
$loeschliste = $loeschliste | Where-Object {$_.Extension -notin @(".jpg", ".png", ".gif")}

# Alle Dateien, die noch in der Löschliste sind, löschen
$loeschliste | Remove-Item

# Oder alles zusammen in einer Zeile:
# dir C:\temp\test -Recurse -File | ?{$_.Extension -notin ".jpg", ".png", ".gif"} | del

Das alles statt in einer .bat-Datei in einer .ps1-Datei speichern. Rechtsklick drauf und "Mit PowerShell starten" anklicken. Wenn du es kurz haben willst, reicht auch nur die letzte Zeile ohne das "#" vorne dran.

PS: Den Ordnerpfad und die Dateitypen, die drin bleiben sollen, musst du natürlich noch an deine Wünsche anpassen.


DarkPyramid 
Fragesteller
 22.04.2022, 22:01

Schreib halt einfach nichts wenn du die Antwort nicht weißt. Die Frage war sehr klar formuliert.

0
daCypher  25.04.2022, 07:31
@DarkPyramid

Ernsthaft jetzt? Was ist das denn für ein Kack-Kommentar?

Ich hab dir die Antwort gegeben, gerade weil ich weiß, was für ein Aufwand das in Batch ist. Konnte ja nicht wissen, dass du dich so sehr darauf versteifst, dass es unbedingt in dem völlig veraltetem und fehleranfälligen Batch sein muss. Normalerweise fragen die Leute nach Batch, weil sie nicht wissen, dass es bessere Alternativen gibt.

Wenn die Datei unbedingt und ohne Ausnahmen mit .bat enden soll, kannst du das Powershell-Script auch einfach aus einer Batch aufrufen:

powershell -ex bypass -c "dir -Recurse -File | ? Extension -notin '.jpg', '.png', '.gif' | del"
0
DarkPyramid 
Fragesteller
 10.11.2022, 16:55
@daCypher

Hier. . der "Aufwand" ist nicht groß wenn man sich auskennt.

for /f %%F in ('dir /b /a-d ^| findstr /vile ".png .jpg .gif .bmp .mp4 .mov .mpeg .avi .cmd"') do del "%%F"

0

Folgende Schritte würde ich für die Batch Datei vorschlagen

  1. Alle gewünschten Dateien per attrib +h +r c:\order\*.ext /s unsichtbar machen oder auch schreibschützen
  2. Dann alle Dateien im Ordner mit del c:\ordner\*.* /s löschen
  3. Die geschützten Dateien wieder per attrib -h -r c:\ordner\*.ext /s schreib- und sichtbar machen, also entsperren.
Woher ich das weiß:Berufserfahrung – IT Support, Studium & Hobby

DarkPyramid 
Fragesteller
 21.04.2022, 08:40

Im AKTUELLEN Ordner IN dem die cmd Datei selbst liegt brauche ich . . eine verschiebbare Datei . .

0
Erzesel  21.04.2022, 09:04

mögliches Prozedere, hat aber den Nachteil, das diene ""Rolle Rückwärts" (attrib -h -r ) auch Dateien betrifft , welche standartmäßig diese Schutzattribute besaßen!

...ergo dürfte es keine Option sein...

1