mit batch-Datei Datei in unbekanntem ordnen/Verzeichnis löschen?
Ich versuche mit einer Batch-Datei eine .exe zu löschen, ich weis aber nicht wo diese .exe ist (z.B. Downloads, Desktop, oder auch unterordner). Hat jemand eine Ahnung wie das geht?
2 Antworten
...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!
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:
- https://ss64.com/nt/where.html
- https://ss64.com/nt/for.html
- https://ss64.com/nt/for_cmd.html
- https://ss64.com/nt/del.html
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:
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?
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
Äußerste Vorsicht mit Wildcards (? und *)
Und immer schön vorher Backups machen - dann gibt es nachher kein Mimimi. 😉
Ja das ist gefährlich mit den Sternchen. Man sollte schon wisssen was man macht. 😉
was würde passieren wen keine Datei mit dem eingegebenem Namen gibt?