quakemarine
Goto Top

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 ?

Content-Key: 268383

Url: https://administrator.de/contentid/268383

Printed on: April 24, 2024 at 23:04 o'clock

Member: rubberman
rubberman Apr 04, 2015 at 14:44:05 (UTC)
Goto Top
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:
@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
Grüße
rubberman
Member: quakemarine
quakemarine Apr 04, 2015 at 16:48:04 (UTC)
Goto Top
thx aber es scheint nicht zu klappen
habe vorhin chkdsk ausgeführt und ich sehe dies auch im event log aber dein batch gibt keinen output zurück

win7 x64
bin per rdp auf dem PC falss das wichtig ist
Member: quakemarine
quakemarine Apr 04, 2015 at 16:57:47 (UTC)
Goto Top
punkt 3 hier sieht gut aus
http://superuser.com/questions/214209/where-are-the-results-of-chkdsk-l ...

ich forsche mal weiter face-smile
Member: rubberman
rubberman Apr 04, 2015 at 17:04:13 (UTC)
Goto Top
Hallo quakemarine.

ich sehe dies auch im event log
Was genau (welches Protokoll, welche Quelle)?

Grüße
rubberman
Member: quakemarine
quakemarine Apr 04, 2015 at 17:27:36 (UTC)
Goto Top
das windowsevent log sagt mir das (weis nicht was du mit protokollen/quellen meinst)

das hier in powershell ausgeführt:
get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file c:\temp.txt
gibt mir aus was ich brauche
aktuell suche ich einen weg diesen cmd in eine batch einzubauen bzw. via batch diesen powershell cmd aufzurufen
das scheint nicht so einfach ....
Member: rubberman
rubberman Apr 04, 2015 at 17:43:32 (UTC)
Goto Top
Teste folgenden leicht veränderten Code:
@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
Grüße
rubberman
Member: quakemarine
quakemarine Apr 04, 2015 at 21:39:46 (UTC)
Goto Top
das wird nicht klappen weil der wmic.. ein powershell cmd ist - kein batch cmd
Member: rubberman
rubberman Apr 04, 2015 updated at 21:52:05 (UTC)
Goto Top
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
Member: quakemarine
quakemarine Apr 04, 2015 at 22:26:39 (UTC)
Goto Top
achso
ich rede vom get-winevent und du vom wmci

soweit klappt dein script
der return ist unschön formatiert
20150404161647 was wohl datum und uhreit ist
ich werde die mit %latest:~0.8% beschneiden und kann dann mit dem wert arbeiten denek ich

mal schauen wie ich daraus eine abfrage bauen kann die prüft ob %latest% älter als 30 tage ist
Member: rubberman
rubberman Apr 04, 2015 at 22:43:48 (UTC)
Goto Top
Das ist ein bisschen umständlich mit Batch, aber machbar.
@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  
Grüße
rubberman
Member: quakemarine
quakemarine Apr 05, 2015 updated at 00:54:41 (UTC)
Goto Top
ich denke meine lösung ist auch ok weil simpler face-smile
wenn ich keinen denkfehler habe rennt diese batch maximal einmal im monat beim booten chkdsk
im schlimmsten fall einmal am 31ten und am tag danach nochmal am 1sten was in meine fall egal ist

thx gummiemann und frohe ostern


@echo off &setlocal

echo test last chkdsk call ...
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 Last chkdsk was: %latest:~0,6%

set YY=%date:~6,10%
set MM=%date:~3,2%

set /a date=%YY%%MM%
set /a diff=%YY%%MM%-%latest:~0,6%
if %diff%==0 goto true

echo Last chkdsk call more one month back
echo reboot to run chkdsk now ...
echo j|chkdsk /f
shutdown /r /t 1
pause
goto chkdsk-end

:true
echo Last chkdsk call %diff% month back
echo reboot not nessessary

:chkdsk-end
Member: rubberman
rubberman Apr 05, 2015 updated at 13:17:32 (UTC)
Goto Top
Alles ist OK, solange es für dich OK ist. Ich bin lediglich von deiner Vorgabe
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
Member: rubberman
rubberman Apr 05, 2015 updated at 13:36:28 (UTC)
Goto Top
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.
@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  
Grüße
rubberman