peterleb
Goto Top

Batch Programmierung CleanTemp

Hallo,

mit:
@echo off
echo %tmp%
del "%tmp%\*.*" /s /q /f  
FOR /d %%p IN ("%tmp%\*.*") DO rmdir "%%p" /s /q  

lösche ich den Inhalt des Temp-Verzeichnisses.

Wie kann ich die gelöschten Dateien und Verzeichnisse mitzählen?

Gruß
Peter

Content-ID: 578087

Url: https://administrator.de/forum/batch-programmierung-cleantemp-578087.html

Ausgedruckt am: 10.04.2025 um 18:04 Uhr

nachgefragt
nachgefragt 10.06.2020 um 07:57:40 Uhr
Goto Top
Zitat von @PeterleB:
Wie kann ich die gelöschten Dateien und Verzeichnisse mitzählen?

Guten Morgen Peter,
ggf. per Logfile?

/LOG:LOGDATEI.txt
144260
Lösung 144260 10.06.2020 aktualisiert um 12:18:23 Uhr
Goto Top
@echo off
set cntfiles=0
set cntfolders=0
for /f "delims=" %%a in ('dir /b /s /a-d "%temp%"') do (del "%%a" >nul 2>&1 && set /a cntfiles+=1)  
for /f "delims=" %%a in ('dir /b /ad "%temp%"') do (rd "%TEMP%\%%a" /s /q >nul 2>&1 && set /a cntfolders+=1)  
echo Geloeschte Dateien : %cntfiles%
echo Geloeschte Ordner: %cntfolders%
PeterleB
PeterleB 10.06.2020 um 14:21:40 Uhr
Goto Top
Hallo,

das funktioniert ja phantastisch!

Vielen Dank.
Gruß
Peter
PeterleB
PeterleB 10.06.2020 um 14:28:52 Uhr
Goto Top
Hi,

doch noch eine Frage:
Um das System-Temp-Verzeichnis (meist: C:\windows\temp, bei mir: F:\wintemp) auch zu löschen, nützt mir die Variable %temp% nichts.
Sie verweist ja nur auf das User-Temp.

Also lese ich den Wert aus der Registry aus:

for /f "tokens=2*" %%a in ('REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v TEMP') do set "systemp=%%~b"  
del "%systemp%\*.*" /s /q /f  
FOR /d %%p IN ("%systemp%\*.*") DO rmdir "%%p" /s /q  

Gibt es einen anderen Weg?

Gruß
Peter
144260
Lösung 144260 10.06.2020 aktualisiert um 14:51:21 Uhr
Goto Top
Zitat von @PeterleB:
Gibt es einen anderen Weg?
Viele Wege führen nach Rom...
for /f "delims=" %%a in ('powershell -EP Bypass -C "[environment]::GetEnvironmentVariable('TEMP','Machine')"') do set "systemp=%%a"  
PeterleB
PeterleB 10.06.2020 aktualisiert um 14:56:21 Uhr
Goto Top
Hallo,

danke.

Einfach beneidenswert.

Meine CleanTemp.bat sieht jetzt so aus:

@echo off
set cntfiles=0
set cntfolders=0
for /f "delims=" %%a in ('dir /b /s /a-d "%temp%"') do (del "%%a" >nul 2>&1 && set /a cntfiles+=1)  
for /f "delims=" %%a in ('dir /b /ad "%temp%"') do (rd "%TEMP%\%%a" /s /q >nul 2>&1 && set /a cntfolders+=1)  

for /f "delims=" %%a in ('powershell -EP Bypass -C "[environment]::GetEnvironmentVariable('TEMP','Machine')"') do set "systemp=%%a"  
for /f "delims=" %%a in ('dir /b /s /a-d "%systemp%"') do (del "%%a" >nul 2>&1 && set /a cntfiles+=1)  
for /f "delims=" %%a in ('dir /b /ad "%systemp%"') do (rd "%SYSTEMP%\%%a" /s /q >nul 2>&1 && set /a cntfolders+=1)  

echo Geloeschte Dateien : %cntfiles%
echo Geloeschte Ordner: %cntfolders%

Gruß
Peter
PeterleB
PeterleB 11.06.2020 aktualisiert um 18:01:32 Uhr
Goto Top
Hallo,

ich hoffe, ich darf noch eine Frage dranhängen.:

Die Ausgabeumleitung
>nul 2>&1

bedeutet doch, dass alle Fehlermeldungen ins Nirvana geschickt werden.
Dann zählen doch cntfiles und cntfolders alle Löschversuche, auch die, wo ein Zugriff verweigert ist.
Demzufolge stimmt die Summe der gelöschten Dateien / Ordner nicht.

Das noch zu unterscheiden, wird wohl sehr schwierig? Man müßte dann sicher in die DO-Anweisung eine Abfrage des standard- error-streams einbauen, die entscheidet, ob cntfiles / cntfolders hoch gezählt wird oder nicht.
Ich denke da an sowas:
if %errorlevel%==1

Grüße
Peter
144260
144260 11.06.2020 aktualisiert um 19:39:35 Uhr
Goto Top
Zitat von @PeterleB:
Die Ausgabeumleitung
>>nul 2>&1
> 

bedeutet doch, dass alle Fehlermeldungen ins Nirvana geschickt werden.
Die Meldungen ja, aber der Exit-Status den der Befehl ausgibt ist immer noch auswertbar.
Dann zählen doch cntfiles und cntfolders alle Löschversuche, auch die, wo ein Zugriff verweigert ist.
Nein! Denn ich verwende nachstehend das && und das führt den SET Befehl nur aus wenn beim vorherigen Befehl kein Fehler aufgetreten ist face-smile, denn das "&&" bedeutet ja: "Führe die folgende Anweisung nur aus wenn es keinen Fehler gab" - ergo werden nur erfolgreiche Löschungen gezählt.
Das noch zu unterscheiden, wird wohl sehr schwierig?
Nö, das hatte ich ja schon berücksichtigt face-wink.
PeterleB
PeterleB 11.06.2020 um 22:34:23 Uhr
Goto Top
Hallo,

wo gibt es denn eine so detaillierte Dokumentation, dass man selbst mal schlauer wird?

Könnte man dennoch feststellen, wieviel Dateien /Ordner nicht gelöscht werden konnten?

Danke killpid

Gruß
Peter
144260
144260 12.06.2020 aktualisiert um 08:07:06 Uhr
Goto Top
Zitat von @PeterleB:

Hallo,

wo gibt es denn eine so detaillierte Dokumentation, dass man selbst mal schlauer wird?
https://de.m.wikibooks.org/wiki/Batch-Programmierung:_Batch-Operatoren
https://ss64.com
https://www.robvanderwoude.com/batchstart.php
Würde aber stattdessen gleich mit Powershell anfangen, Batch ist ehrlich gesagt schon über der Halbwertszeit.

Könnte man dennoch feststellen, wieviel Dateien /Ordner nicht gelöscht werden konnten?
hinter das bestehendes Set anfügen. Was


PeterleB
PeterleB 12.06.2020 um 13:33:48 Uhr
Goto Top
Hallo killpid

Batch sieht jetzt so aus:

@echo off
set cntfiles=0
set cntfolders=0
set cnterrors=0
for /f "delims=" %%a in ('dir /b /s /a-d "%temp%"') do (del "%%a" >nul 2>&1 && set /a cntfiles+=1 || set /a cnterrors+=1)  
for /f "delims=" %%a in ('dir /b /ad "%temp%"') do (rd "%TEMP%\%%a" /s /q >nul 2>&1 && set /a cntfolders+=1 || set /a cnterrors+=1)  

for /f "delims=" %%a in ('powershell -EP Bypass -C "[environment]::GetEnvironmentVariable('TEMP','Machine')"') do set "systemp=%%a"  
for /f "delims=" %%a in ('dir /b /s /a-d "%systemp%"') do (del "%%a" >nul 2>&1 && set /a cntfiles+=1 || set /a cnterrors+=1)  
for /f "delims=" %%a in ('dir /b /ad "%systemp%"') do (rd "%SYSTEMP%\%%a" /s /q >nul 2>&1 && set /a cntfolders+=1 || set /a cnterrors+=1)  

echo Geloeschte Dateien : %cntfiles%
echo Geloeschte Ordner: %cntfolders%
echo Nicht geloeschte Dateien / Ordner: %cnterrors%

Der Fehlerzähler bleibt jedoch immer "0", obwohl definitiv nicht alles gelöscht wurde.
Habe ich einen Denkfehler?

Gruß
Peter
144260
144260 12.06.2020 aktualisiert um 16:56:48 Uhr
Goto Top
Zitat von @PeterleB:
Habe ich einen Denkfehler?
Nein, aber du bist in eine der diversen Bugs in der Batch gefallen, die wohl niemals mehr von MS gefixed werden. RD und DEL geben je nach Fehlermeldung falsche Exit-Codes zurück, hier brauchst du einen Workaround.
Siehe
https://stackoverflow.com/questions/11137702/rd-exits-with-errorlevel-se ...
for /f "delims=" %%a in ('dir /b /s /a-d "%temp%"') do ( 3>nul 2>&1 1>&3 del /F "%%a" | findstr "^" >nul && set /a cnterrors+=1 || set /a cntfiles+=1)  
for /f "delims=" %%a in ('dir /b /ad "%temp%"') do ( 3>nul 2>&1 1>&3 rd "%TEMP%\%%a" /s /q | findstr "^" >nul && set /a cnterrors+=1 || set /a cntfolders+=1)  
REM usw.
Noch ein Grund mehr lieber gleich zur Powershell über zu gehen!

Das man bei laufendem Betrieb den Temp-Ordner meist nie ganz leer bekommt, liegt in der Natur der Sache. Anwendungen haben dort meist Dateien im ständigen Zugriff, die man denen eben nicht einfach so unter den Füßen weg ziehen kann ohne das sie einem das übel nehmen würden face-wink.

So ich bin hier jetzt raus - zu viel von dem 80er Batch Zeug rauchen ist schlecht für die Gesundheit face-smile.
PeterleB
PeterleB 13.06.2020 um 11:13:48 Uhr
Goto Top
Hi,

nochmals vielen Dank.

Werde mich doch mal der Powershell widmen.

Gruß
Peter