Chkdsk - wurde es ausgeführt ?
hiho
mein plan ist:
per autostart beim booten des PC zu fragen wann chkdsk zuletzt ausgeführt wurde
wenn älter als X tage dann chkdsk setzen und neubooten
nur "OB" es wirklich gelaufen ist weis ich nicht - hier ist mein problem
ich kann zwar via temp files und echos ein localed files schreiben aber das sagt ja nur dass der cmd gesetz wurde
ob nun wirklich chkdsk /f gestartet wurde beim boot bleibt ein räsel ?
gibts da eine lösung ? Kann ich windows "fragen" wann der letzte systemchek war ?
mein plan ist:
per autostart beim booten des PC zu fragen wann chkdsk zuletzt ausgeführt wurde
wenn älter als X tage dann chkdsk setzen und neubooten
nur "OB" es wirklich gelaufen ist weis ich nicht - hier ist mein problem
ich kann zwar via temp files und echos ein localed files schreiben aber das sagt ja nur dass der cmd gesetz wurde
ob nun wirklich chkdsk /f gestartet wurde beim boot bleibt ein räsel ?
gibts da eine lösung ? Kann ich windows "fragen" wann der letzte systemchek war ?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 268383
Url: https://administrator.de/forum/chkdsk-wurde-es-ausgefuehrt-268383.html
Ausgedruckt am: 22.04.2025 um 07:04 Uhr
13 Kommentare
Neuester Kommentar
Hallo quakemarine,
du könntest ein Query auf das entsprechende Event setzen. Keine Ahnung in welcher Sprache du das gerade umsetzt - per Batch etwa so:
Grüße
rubberman
du könntest ein Query auf das entsprechende Event setzen. Keine Ahnung in welcher Sprache du das gerade umsetzt - per Batch etwa so:
@echo off &setlocal
set "latest="
for /f "tokens=2 delims==." %%i in (
'WMIC NTEVENT WHERE "LogFile='application' AND SourceName='Chkdsk'" GET TimeGenerated /value'
) do if not defined latest set "latest=%%i"
echo Zuletz ausgefuehrt: %latest%
pause
rubberman
Teste folgenden leicht veränderten Code:
Grüße
rubberman
@echo off &setlocal
set "latest="
for /f "tokens=2 delims==." %%i in (
'WMIC NTEVENT WHERE "LogFile='application' AND SourceName='Microsoft-Windows-Wininit' AND EventCode=1001" GET TimeGenerated /value'
) do if not defined latest set "latest=%%i"
echo Zuletz ausgefuehrt: %latest%
pause
rubberman
Wie kommst du darauf? WMIC ist ein Kommandozeilentool das natürlich in einem Batchcode aufgerufen werden kann. Habe ich übrigens auch getestet (so wie schon das erste Script).
Der Unterschied zwischen dem ersten und dem zweiten Script ist übrigens, dass du mit dem ersten die Events findest, die CHKDSK während einer laufenden Windows-Session auslöst. Musst du die Datenträgerüberprüfung allerdings für den nächsten Neustart planen (z.B. weil die Windowspartition geprüft werden soll), dann ergibt sich ein anderer Eintrag im Eventlog, der mit dem zweiten Script gefunden wird.
Grüße
rubberman
Der Unterschied zwischen dem ersten und dem zweiten Script ist übrigens, dass du mit dem ersten die Events findest, die CHKDSK während einer laufenden Windows-Session auslöst. Musst du die Datenträgerüberprüfung allerdings für den nächsten Neustart planen (z.B. weil die Windowspartition geprüft werden soll), dann ergibt sich ein anderer Eintrag im Eventlog, der mit dem zweiten Script gefunden wird.
Grüße
rubberman
Das ist ein bisschen umständlich mit Batch, aber machbar.
Grüße
rubberman
@echo off &setlocal
set "latest="
for /f "tokens=2 delims==." %%i in (
'WMIC NTEVENT WHERE "LogFile='application' AND SourceName='Microsoft-Windows-Wininit' AND EventCode=1001" GET TimeGenerated /value'
) do if not defined latest set "latest=%%i"
set "latest=%latest:~,8%"
echo Zuletz ausgefuehrt: %latest%
call :DaysAdd %latest% 30 newrun
echo Naechste Ausfuehrung nach: %newrun%
for /f "tokens=2 delims==." %%d in ('WMIC OS GET LocalDateTime /value') do set "datestamp=%%d"
echo Heute: %datestamp:~,8%
if %newrun% lss %datestamp:~,8% (
echo CHKDSK muss ausgefuehrt werden.
) else (
echo CHKDSK nicht erforderlich.
)
pause
exit /b
:DaysAdd ByVal_DateStampIn ByVal_DeltaIn ByRef_DateStampOut
setlocal EnableExtensions
set "ds=%~1"
set /a "yy = %ds:~,4%, mm = 100%ds:~4,2% %% 100, dd = 100%ds:~6,2% %% 100"
set /a "a = 14 - mm, a /= 12, b = yy + 4800 - a, c = mm + 12 * a - 3, d = 153 * c + 2"
set /a "d = d / 5 + dd + b * 365 + b / 4 - b / 100 + b / 400 - 1 + %~2"
set /a "e = 4 * d + 3, e /= 146097, f = -e * 146097, f /= 4, f += d"
set /a "g = 4 * f + 3, g /= 1461, h = -1461 * g, h /= 4, h += f, i = 5 * h + 2, i /= 153, dd = 153 * i + 2, dd /= 5"
set /a "dd = -dd + h + 101, mm = -i / 10, mm *= 12, mm += i + 103, yy = e * 100 + g - 4800 + i / 10"
endlocal &set "%~3=%yy%%mm:~-2%%dd:~-2%" &exit /b
rubberman
Alles ist OK, solange es für dich OK ist. Ich bin lediglich von deiner Vorgabe
Grüße
rubberman
die prüft ob %latest% älter als 30 tage ist
ausgegangen. Rechnerei mit Datumswerten wird nativ nicht unterstützt, darum die etwas ausführliche Subroutine. Ist mehr Code, bremst dich aber nicht aus, weil diese in wenigen Millisekunden abgearbeitet ist. Bei den WMIC Aufrufen sieht das anders aus...Grüße
rubberman
EDIT
Ich hab mal den 2. WMIC Aufruf zugunsten der Verarbeitung der %date% Variablen rausgeschmissen, damit es etwas schneller geht. Außerdem das Problem gefixt, dass das Script abbricht, falls CHKDSK noch nie ausgeführt wurde oder der WMIC Aufruf fehlgeschlagen ist.
Grüße
rubberman
Ich hab mal den 2. WMIC Aufruf zugunsten der Verarbeitung der %date% Variablen rausgeschmissen, damit es etwas schneller geht. Außerdem das Problem gefixt, dass das Script abbricht, falls CHKDSK noch nie ausgeführt wurde oder der WMIC Aufruf fehlgeschlagen ist.
@echo off &setlocal
set "latest="
for /f "tokens=2 delims==." %%i in (
'WMIC NTEVENT WHERE "LogFile='application' AND SourceName='Microsoft-Windows-Wininit' AND EventCode=1001" GET TimeGenerated /value'
) do if not defined latest set "latest=%%i"
if not defined latest set "latest=19700101"
set "latest=%latest:~,8%"
echo Zuletz ausgefuehrt: %latest%
call :DaysAdd %latest% 30 newrun
echo Naechste Ausfuehrung nach: %newrun%
for /f "tokens=1-3 delims=." %%i in ("%date:* =%") do set "datestamp=%%k%%j%%i"
echo Heute: %datestamp%
if %newrun% lss %datestamp% (
echo CHKDSK muss ausgefuehrt werden.
) else (
echo CHKDSK nicht erforderlich.
)
pause
exit /b
:DaysAdd ByVal_DateStampIn ByVal_DeltaIn ByRef_DateStampOut
setlocal EnableExtensions
set "ds=%~1"
set /a "yy = %ds:~,4%, mm = 100%ds:~4,2% %% 100, dd = 100%ds:~6,2% %% 100"
set /a "a = 14 - mm, a /= 12, b = yy + 4800 - a, c = mm + 12 * a - 3, d = 153 * c + 2"
set /a "d = d / 5 + dd + b * 365 + b / 4 - b / 100 + b / 400 - 1 + %~2"
set /a "e = 4 * d + 3, e /= 146097, f = -e * 146097, f /= 4, f += d"
set /a "g = 4 * f + 3, g /= 1461, h = -1461 * g, h /= 4, h += f, i = 5 * h + 2, i /= 153, dd = 153 * i + 2, dd /= 5"
set /a "dd = -dd + h + 101, mm = -i / 10, mm *= 12, mm += i + 103, yy = e * 100 + g - 4800 + i / 10"
endlocal &set "%~3=%yy%%mm:~-2%%dd:~-2%" &exit /b
rubberman