mit batch-Datei Datei in unbekanntem ordnen/Verzeichnis löschen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

...dann such sie doch...

von Hand in der Console:

where "deinProgram.exe"

...dürfte nicht Zielführend sein, den es sucht nur in den Pfaden der path-variable

where /r c:\ "deinProgram.exe"

...sucht brutal im gesamten Laufwerk.

In einer Batch sähe eine automatische suche mit Verarbeitung des Ergebnises so aus:

demo1.cmd

@echo off
chcp 65001 >nul

set "ProgramName=deinProgram.exe"
for /f "tokens=*" %%a in ('where /r c:\ "%ProgramName%" 2^>nul') do (
  set "Found=%%~a"
)
rem zum scharfmachen das echo vor  dem Del entfernen.
rem !!!Das if defined... ist extrem  wichtig, sonst  mach del wenn nichts  gefunden wurde  den  Ordner  der Batch  platt!!!!! 
rem das  sind  die  Tücken der automatisierung  unter  Batch!!!!
if defined found (
    echo del "%found%"
) else (echo Nichts gefunden...)
pause

allerdings ist das extrem langsam, da where erstmal das ganze Laufwerk am Stück durchsucht bevor es die Ergebnisse an die Variable übergibt.😴😖

Lösung: wir zergliedern die Suche auf einzelne Hauptordner der Festplatte (Program Files, Users usw.) und brechen ab, wenn ein Treffer gelandet wurde. Der Windows-Ordner, und versteckte System-Ordner wie der Papierkorb oder die Widerherstellung usw. werden komplett ausgeschlossen. (da sollte man nicht im "Blindflug" drin herumpfuschen)

demo2.cmd

@echo off
chcp 65001 >nul

set "ProgramName=deinProgram.exe"

for /f "tokens=*" %%f in ('dir /b /ad /a-h "C:\"^|find /v /i "windows"') do (
    for /f "tokens=*" %%a in ('where /r "c:\%%~f" "%ProgramName%" 2^>nul') do (
        set "Found=%%~a"
        goto :break
    )
)
:break
rem zum scharfmachen das echo vor  dem Del entfernen.
rem !!!Das if defined... ist extrem  wichtig, sonst  mach del wenn nichts  gefunden wurde  den  Ordner  der Batch  platt!!!!! 
rem das  sind  die  Tücken der automatisierung  unter  Batch!!!!
if defined found (
    echo del "%found%"
) else (echo Nichts gefunden...)
pause
Wenn Du irgendwelche zerstörenden Befehle (del , rd, move, rename usw.) automatisiert auf das Ergebnis einer Operation ausführst : Sei extrem Vorsichtig. Batch ist absolut gnadenlos. Was versaut wurde kann man nicht mehr rückgängig machen!
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
gregbomb 
Fragesteller
 15.10.2022, 10:23

probiere es später

aber schon mal danke.

0
gregbomb 
Fragesteller
 15.10.2022, 10:54

was würde passieren wen keine Datei mit dem eingegebenem Namen gibt?

0
Erzesel  15.10.2022, 15:56
@gregbomb

Wenn Du's so machst wie in den Scripten gezeigt, kommt lediglich die Meldung "Nichts gefunden...".

Ich habe extra zum probieren den del-Befehl entschärft. Wie auch immer passiert nichts, solange du nicht das "echo" davor entfernst.

0
gregbomb 
Fragesteller
 15.10.2022, 19:23
@Erzesel

sry dass ich nochmal frage, aber der Code ist für mein Verwendungszweg zu langsam, kann man es so machen das es nur bestimmte Ordner durchsucht?

ohne für jeden Ordner eine einzelnen del Befehl

0
Erzesel  15.10.2022, 23:16
@gregbomb
ohne für jeden Ordner eine einzelnen del Befehl

Bisher war nur die Rede von einer exe.datei deshalb habe ich mir ja den Umstand mit der Abbruchbedingung gemacht. Natürlich wäre wesentlich unkomplizierter die dicke Keule anzusetzten und in jedem Ordner wo die exe auftaucht diese plattzumachen.

und es ist auch leichter eine definierte Liste von Ordnerpfaden zu übergeben unter denen Where suchen soll.

set "ProgramName=deinProgram.exe"
for  %%f in ("f:\irgendein ordner\blubb" , "%UserProfile%\desktop" , "%UserProfile%\downloads" , "c:\irgendwas\ratzeputz" ) do (
    for /f "tokens=*" %%a in ('where /r "%%~f" "%ProgramName%" 2^>nul') do (
        echo del "%%~a"
    )
)

...das ist schon eine kleine Venichtungsmaschine. Diese durchsucht die angegebenen Ordner (und die Ordner darunter) und löscht jede Datei mit dem angegebenen Namen.

Sollen nur die angegebenen Ordner ohne Unterverzeichnisse durchsucht werden , sieht die Show folgendermaßen aus:

set "ProgramName=deinProgram.exe"
 rem  alle pfade durch semikolon getrennt angeben
set "FolderList=f:\irgendein ordner\blubb;%UserProfile%\desktop;%UserProfile%\downloads;c:\irgendwas\ratzeputz"
for /f "tokens=*" %%a in ('where "%FolderList%:%ProgramName%" 2^>nul') do (
        echo del "%%~a"
)

 ... natürlich kannst Du in der Variable FolderList auch nur einen Pfad angeben.

Glossar:

Im übrigen solltest Du dich nicht allzusehr an Batch festbeißen. Powershell kann fast alles viel besser und einfacher. Da sähe der "Klumpatsch" so aus:

#hübsch
Get-ChildItem  @(
  'f:\irgendein ordner\blubb',
  "$env:UserProfile\desktop",
  "$env:UserProfile\downloads",
  'c:\irgendwas\ratzeputz'
) -Filter 'deinProgram.exe' -ErrorAction SilentlyContinue|
    Remove-Item -whatif       #zum schrfmachen -whatif entfernen

#schmutig
gci @('f:\irgendein ordner\blubb',"$env:UserProfile\desktop","$env:UserProfile\downloads",'c:\irgendwas\ratzeputz') -fi 'deinProgram.exe' -ea sil|ri -wi       #zum schrfmachen -wi entfernen
der Code ist für mein Verwendungszweg zu langsam

Was hast Du denn vor?

Wenn man nichtmal weiß wo sich eine Datei befindet, gibt es eigentlich nichts was so zeitkritisch wäre, man nicht auf das Ergebnis einer Suche warten könnte.

Wenn Dir vorschwebt Ordner auf das erscheinen einer bestimmten Datei zu überwachen und dabei meine Routine in einem goto-Loop sich widerholend laufen zu lassen, bist Du total auf dem Holzweg. Ein solches Vorgehen wäre in Sachen Prozessor und (vor allem) Laufwerksbelastung ein totales Fiasko.

...dann ist Batch die falsch Sprache!

Für die Überwachung von Dateisystemoperationen gibt es eine Systeminterne Routine.

Diese reagiert nur wenn irgendwas im zu überwachenden Ordner und dessen Unterverzeichnissen passiert ohne ständig durch das das Dateisystem zu hächeln. (wenn du eine Maus fangen willst stellst Du eine Fallen auf und läufst nicht von Loch zu Loch und schaust nach ob sie zuhause ist)

Verwendung in Powershell:

1
gregbomb 
Fragesteller
 16.10.2022, 10:26
@Erzesel

PowerShell geht nicht weil ich es über den autostart Ordner automatisch ausführen lassen will.

Ich hab beide deiner 2 (Neuen) .bat befehle getestet, mit der ziel Datei auf dem Desktop und es hat nicht funktioniert. (und ja ich habe alle deinProgram.exe mit dem Dateinamen ersetzt und echo entfernt)

woran könnte das liegen?

0
gregbomb 
Fragesteller
 17.10.2022, 11:19
@gregbomb

hab scheinbar ein Fehler gemacht die bat geht perfekt, sry danke

0

Nehmen wir mal an. Du willst ein Bild namens Bild001.jpg löschen, das sich irgendwo auf Laufwerk E: befindet. Dann wie folgt mit Parameter /s

del E:\Bild001.jpg /s
mchawk777  14.10.2022, 21:37

Äußerste Vorsicht mit Wildcards (? und *)
Und immer schön vorher Backups machen - dann gibt es nachher kein Mimimi. 😉

1
merkurus  14.10.2022, 21:58
@mchawk777

Ja das ist gefährlich mit den Sternchen. Man sollte schon wisssen was man macht. 😉

0