PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : script für chkdsk Ergebnis?



HaWe
26.03.2019, 18:30
hallo,
gibt es ein script für die Anzeige vom letzten chkdsk Ergebnis (z.B. über Notepad etc.)?
(Windows 7 64 prof)

Moppi
26.03.2019, 18:53
Hallo,

noch nie was davon gehört. Du kannst aber eine Batch schreiben, darin CHDKDSK aufrufen und die Ausgabe in eine Datei (z.b. ergebnis.txt) umleiten. Dann kannst Du jederzeit auf das letzte Ergebnis zugreifen.

MfG

HaWe
26.03.2019, 21:09
Hallo,

noch nie was davon gehört. Du kannst aber eine Batch schreiben, darin CHDKDSK aufrufen und die Ausgabe in eine Datei (z.b. ergebnis.txt) umleiten. Dann kannst Du jederzeit auf das letzte Ergebnis zugreifen.

MfG

das geht leider nicht (soweit ich weiß), wenn ich ein gesperrtes Laufwerk wie c: überprüfen will, was dann erst beim (d.h. kurz vor dem) erneuten Windows-Neustart ausgeführt wird: darum geht es mir vor allem...
chkdsk c: /F /R /B
oder wie machst du das genau?

Moppi
27.03.2019, 05:51
Ich habe sowas nie gebraucht. Und wenn, früher, hab ich es so gemacht, wie ich geschrieben hab.
In Windows wird das Prüfergebnis aber in einem "CHKDSK-Log" bzw. "CHKDSK-Protokoll" gespeichert. Das kann man nachträglich einsehen. Mal im Netz suchen. Suchbegriffe: "CHKDSK-Log" "CHKDSK-Protokoll" einsehen

Ich kann Dir aber nicht sagen, in welchen Dateien das dann steht. Aber aus Zeiten mit Visual Basic Weiß ich, dass man leicht auf viele windowsinterne Sachen zugreifen kann, mindestens auf die Systemregistrierungseinträge. Da Du ja den C++-Builder im Gange hast, könnte man sicher darüber auch was machen, da man die Ergebnisse auch über die windowsinternen Tools ansehen kann, wie Du bei den Suchergebnissen s.o. sehen wirst.

MfG

HaWe
27.03.2019, 08:34
Ich habe sowas nie gebraucht. Und wenn, früher, hab ich es so gemacht, wie ich geschrieben hab.
In Windows wird das Prüfergebnis aber in einem "CHKDSK-Log" bzw. "CHKDSK-Protokoll" gespeichert. Das kann man nachträglich einsehen. Mal im Netz suchen. Suchbegriffe: "CHKDSK-Log" "CHKDSK-Protokoll" einsehen

Ich kann Dir aber nicht sagen, in welchen Dateien das dann steht. Aber aus Zeiten mit Visual Basic Weiß ich, dass man leicht auf viele windowsinterne Sachen zugreifen kann, mindestens auf die Systemregistrierungseinträge. Da Du ja den C++-Builder im Gange hast, könnte man sicher darüber auch was machen, da man die Ergebnisse auch über die windowsinternen Tools ansehen kann, wie Du bei den Suchergebnissen s.o. sehen wirst.

MfG

meine Frage war nicht, ob du so was noch nie gebraucht hast und/oder ob du es NICHT weißt, sondern:

gibt es ein script für die Anzeige vom letzten chkdsk Ergebnis (z.B. über Notepad etc.)?
(Windows 7 64 prof)
es steht irgendwo in der Ereignisanzeige, aber irrsinnig schwer auffindbar, daher meine Frage nach einem Script, das das sofort auf den Schirm bringt

Ceos
27.03.2019, 09:12
ich habe da einen Stackoverflow Eintrag gefunden der als Ergebnis eine bat hat die deinen Zwecken dienen sollte :)

in der anderen Antwort steckt ein relativ kurzer Powershell Script, der bei mir zumindest 1 mal funktioniert hat

https://stackoverflow.com/questions/38504689/how-can-i-get-the-results-of-a-chkdsk-that-run-on-boot

soweit ich den Inhalt verstanden habe macht er auch nichts böses :)

die Variante mit der Powershell aus der alternativen Antwort finde ich besser, weil minimalistischer

HaWe
27.03.2019, 09:57
ich habe da einen Stackoverflow Eintrag gefunden der als Ergebnis eine bat hat die deinen Zwecken dienen sollte :)

in der anderen Antwort steckt ein relativ kurzer Powershell Script, der bei mir zumindest 1 mal funktioniert hat

https://stackoverflow.com/questions/38504689/how-can-i-get-the-results-of-a-chkdsk-that-run-on-boot

soweit ich den Inhalt verstanden habe macht er auch nichts böses :)

die Variante mit der Powershell aus der alternativen Antwort finde ich besser, weil minimalistischer

was meinst du mit powershell script?
das hier?

get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file Desktop\CHKDSKResults.txt

das gibt einen Fehler

Der Befehl "get-winevent" konnte nicht gefunden werden.


Das Batchfile

@echo off
Title Check Disk drives for errors and fix them by Hackoo 2016
mode con cols=67 lines=5 & Color 0A
:::::::::::::::::::::::::::::::::::::::::
:: Automatically check & get admin rights
:::::::::::::::::::::::::::::::::::::::::
set "TmpLog=%Tmp%\TmpLog.txt"
set "Log=%~dp0%computername%_%~n0.txt"
set "MyVBSFile=%~dp0%~n0_On_Boot.vbs"
set "Value=CHKDSK_ON_BOOT"
Set "Key=HKCU\Software\Microsoft\Windows\CurrentVersion \RunOnce"
If Exist "%TmpLog%" Del "%TmpLog%"
If exist "%Log%" Del "%Log%"
REM --> Check for permissions
Reg query "HKU\S-1-5-19\Environment" >nul 2>&1
REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
Echo.
ECHO **************************************
ECHO Running Admin shell... Please wait...
ECHO **************************************

goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

"%temp%\getadmin.vbs"
del "%temp%\getadmin.vbs"
exit /B

:gotAdmin
::::::::::::::::::::::::::::
:: START ::
::::::::::::::::::::::::::::
( Echo Scan started @ & Date /T & Time /T & echo ************************ ) > "%TmpLog%"
setlocal ENABLEDELAYEDEXPANSION
for /f "tokens=2" %%i in ('wmic logicaldisk where "drivetype=3" ^|find /i ":"') do (
set "fix=%%i"
Call :Affich !fix!
(
echo !fix! Drive
echo ************************
echo(
(echo O
echo Y) | CHKDSK !fix! /f
echo(
echo ************************
)>> "%TmpLog%"
)
EndLocal
Goto Question
Exit /b
::************************************************ ******************
:Question
( echo Scan finished @ & Date /T & Time /T & echo ************************ )>> "%TmpLog%"
CMD /U /C Type "%TmpLog%" > "%Log%"
If Exist "%TmpLog%" Del "%TmpLog%"
(
echo Answ = MsgBox("Did you want to reboot the computer to complete the scanning ?",VbYesNo+VbQuestion,"Reboot the computer to check hard disk drives for errors by Hackoo"^)
echo If Answ = VbYes then
echo wscript.Quit(0^)
echo Else
echo wscript.Quit(1^)
echo End If
)>"%tmp%\%~n0.vbs"

Cscript /nologo "%tmp%\%~n0.vbs"
IF "%errorlevel%" EQU "1" ( goto AddKey ) else ( goto Shutdown )
::************************************************ ******************
:Shutdown
echo(
cls
echo(
echo Save your work - Reboot of your computer in 120 seconds
echo(
echo Enregistrer vos documents - Redemarrage du PC dans 120 seconds
Call:AddKey && Shutdown.exe /r /t 120 /c "Enregistrer vos documents - Redemarrage du PC dans 120 secondes"
pause>nul
exit /b
::************************************************ ******************
:Affich
Cls
echo(
echo ***********************************
Echo Please wait a while Scanning "%~1"
echo ***********************************
Timeout /T 2 /nobreak>nul
exit /b
::************************************************ ******************
:AddKey
reg query "%key%" /v "%Value%" >nul 2>&1
If "%errorlevel%" EQU "0" ( Goto :EOF
) Else (
reg add "%Key%" /v "%Value%" /t REG_SZ /d "%MyVBSFile%">nul
(
echo Option Explicit
echo 'Run as Admin
echo If Not WScript.Arguments.Named.Exists("elevate"^) Then
echo CreateObject("Shell.Application"^).ShellExecute DblQuote(WScript.FullName^) _
echo , DblQuote(WScript.ScriptFullName^) ^& " /elevate", "", "runas", 1
echo WScript.Quit
echo End If
echo Dim ws,PSCommand,LogFile,ret
echo LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.Scrip tFullName, "."^)^) ^& "txt"
echo set ws = createobject("wscript.shell"^)
echo PSCommand = "cmd /c Powershell -Command ""& ""Get-winevent -FilterHashTable @{logname='Application'; id='1001'}^|?{$_.providername -match 'wininit'} ^| fl timecreated, message ^| out-file "^& SimpleQuote(LogFile^) ^&""
echo ret = ws.run(PScommand,0,True^)
echo ws.run DblQuote(LogFile^)
echo '**************************************
echo Function DblQuote(Str^)
echo DblQuote = chr(34^) ^& Str ^& chr(34^)
echo End function
echo '**************************************
echo Function SimpleQuote(Str^)
echo SimpleQuote = ChrW(39^) ^& Str ^& ChrW(39^)
echo End Function
echo '**************************************
)>"%MyVBSFile%"
start "" "%Log%"
)
Exit /b
::************************************************ *******************
hingegen ist auch nicht bauchbar, weil es nicht die chkdsk-Ergebnisse listet, die bereits gelaufen sind (z.B. auch bei von Windows selber erzeugten chkdsk Läufen auf Grund von Bootfehlern)

Ceos
27.03.2019, 10:06
hast du den powershell script denn auch in der "powershell" ausgeführt? Die klassische cmd ist nur die "Konsole"


get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file Desktop\CHKDSKResults.txt


da du die pro variante hast, sollte es sich über das startmenü tehoretisch leicht finden lassen

HaWe
27.03.2019, 10:17
edit: habs gefunden, gibt aber auch Fehler:

Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.

PS C:\Windows\System32\WindowsPowerShell\v1.0> get-winevent -FilterHashTable @{l
ogname="Application"; id="1001"}| ?{$_.providername -match "wininit"} | fl timec
reated, message | out-file Desktop\CHKDSKResults.txt
Out-File : Ein Teil des Pfades "C:\Windows\System32\WindowsPowerShell\v1.0\Desk
top\CHKDSKResults.txt" konnte nicht gefunden werden.
Bei Zeile:1 Zeichen:140
+ get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.provi
dername -match "wininit"} | fl timecreated, message | out-file <<<< Desktop\CH
KDSKResults.txt
+ CategoryInfo : OpenError: (:) [Out-File], DirectoryNotFoundExce
ption
+ FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.Ou
tFileCommand

PS C:\Windows\System32\WindowsPowerShell\v1.0>


irgendwie ist das verkorkst wie es scheint...

Ceos
27.03.2019, 10:21
De sk
top

Du hast da glaube ich ein Leerzeichen reingehauen, passe mal das Ende der Zeile an, dass er die Datei auf einem absoluten und nciht relativen Pfad legt, also statt

out-file Desktop\CHKDSKResults.txt

out-file <AbsoluterPfadZuEinemOrdner>\CHKDSKResults.txt

bedenke dass Leerzeichen im Pfad problematisch sein können und du den Dateinamen eventuell inklusive Pfad in Anführungszeichen setzen musst

OT: "bedenke dass" oder "bedenke das" ??? hab grad irgendwie eine Data Corruption im Hirn .. da ist etwas von meiner Schulbildung verloren gegangen

HaWe
27.03.2019, 10:26
ich hatte den Befehl nur per c+p eingefügt
get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file Desktop\CHKDSKResults.txt

edit:
Out-File : Es wurde kein Parameter gefunden, der dem Parameternamen "FilterHashTable" entspricht.
Bei Zeile:1 Zeichen:195
+ get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername -match "wininit"} | fl timecreat
ed, message | out-file Desktop\CHKDSKResults.txtget-winevent -FilterHashTable <<<< @{logname="Application"; id="1001"}
| ?{$_.providername -match "wininit"} | fl timecreated, message | out-file Desktop\CHKDSKResults.txt
+ CategoryInfo : InvalidArgument: (:) [Out-File], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Comman ds.OutFileCommand

Da ist total der Wurm drin.

Oder wie lautet der Befehl korrekt?

PS, manchmal tut Powershell auch überhaupt nichts und erzeugt noch nicht mal eine Fehlermeldung, und ich habe noch nicht mal eine Möglichkeit zum Editieren, Einfügen oder Kopieren in dem (mi******) Terminal ... :-

Ceos
27.03.2019, 11:10
ärgerlich, vielleicht ein windows 7 vs 8 ding :(

sorry, habe leider keinen 7er in reichweite zum bateln und testen, sorry

HaWe
27.03.2019, 11:15
@Ceos: ok, danke für die Idee!


PS
@Moppi:
wenn du eine Befehlszeile kennst, die das chkdsk Ergebnis auch für c: /F (...) nach einem dann notwendigen Reboot in eine eigene separate Datei schreibt, dann nenne sie bitte!

Moppi
28.03.2019, 08:19
Ich habe es mal unter Windows 7 ausprobiert. Da ich einen Pfadfehler hatte, habe ich die Zeile etwas abgeändert, die CHKDSKResults.txt befindet sich bei mir dann in: C:\Windows\System32
In der Datei steht auch was drin. Es sind mehrere (also wohl alle) Ergebnisse der letzten CHKDSK-Durchläufe enthalten.

Ich habe Power Shell als Administrator aufgerufen, damit es funktioniert. Ich habe diese Zeile dort hinein kopiert und ausgeführt:


get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file CHKDSKResults.txt

Ceos
28.03.2019, 08:39
*Kopf->Tisch* ... Admin Modus ... ist bei mir schon impliziter Standard wenn ich die Shell benutze

Sorry daran habe ich nicht gedacht bei meiner Erklärung XD

aber auch verständlich irgendwo, ich hab die Zeile bei mienem Versuch direkt so angepasst dass er mir die Datei auf meinen Desktop packt(da wäre der Admin Modus auch egal), wenn man es aber einfach so ohne Pfad macht läuft die Shell in System32 und da braucht man Admin Rechte um Dateien zu schreiben

HaWe
28.03.2019, 08:50
aahhh....als Administrator...! 8)
Danke für den Tipp!! 8)

habe jetzt c:\ als Ausgabepfad, zur Sicherheit,

get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file c:\CHKDSKResults.txt
und siehe da: hier ist die gesuchte Info:

" CHKDSK hat freien Speicher gefunden, der in der MFT-Bitmap (Master
File Table) als zugeordnet gekennzeichnet ist.
CHKDSK hat freien Speicher gefunden, der in der Volumebitmap als
zugeordnet gekennzeichnet ist.
Windows hat Probleme im Dateisystem behoben."

Kann man jetzt irgendwie ein .BAT File schreiben, das Powershell im Admin-Modus aufruft und diese Befehlszeile als Parameter automatisch ausführt?

Ceos
28.03.2019, 09:07
habe jetzt c:\ als Ausgabepfad, zur Sicherheit,

Ab Win8+ hilft das auch nicht, da ist quasi ganz c: gesichert (entsprechende User Unterordner haben natürlich Sonderregeln), nur so als Hinweis für die Zukunft


Kann man jetzt irgendwie ein .BAT File schreiben, das Powershell im Admin-Modus aufruft und diese Befehlszeile als Parameter automatisch ausführt?

Man könte sich jetzt bemühen und das bat was ich gelinkt habe versuchen zu zerlegen, aber batch ist mir zu gruselig

HaWe
28.03.2019, 09:09
ok, dann nehme ich d:\ zukünftig als Ausgabepfad...

aber wie packt man jetzt alles in 1 .BAT file (oder .cmd o.ä. ) ?
Es kann ja alles vlt in 1 einzige commando-Zeile

(edit, hatte sich überschnitten mit Ceos)

Moppi
28.03.2019, 10:26
Man kann diese Zeile in ein PS1-File speichern. Dazu habe ich das im Netz gefunden: https://www.script-example.com/wie-erstelle-ich-ein-PowerShell-Skript

in Windows 7 kenne ich 2 Möglichkeiten: Autostart und Aufgabenplanung, um es beim Start dann auszuführen.
Vermutlich dann mit: powershell.exe Dateiname
Eventuell ist aber auch noch ein Schalter notwendig, wenn man Admin-Rechte dafür benötigt, musst Du dann mal schauen.

MfG

HaWe
28.03.2019, 11:25
Man kann diese Zeile in ein PS1-File speichern. Dazu habe ich das im Netz gefunden: https://www.script-example.com/wie-erstelle-ich-ein-PowerShell-Skript

in Windows 7 kenne ich 2 Möglichkeiten: Autostart und Aufgabenplanung, um es beim Start dann auszuführen.
Vermutlich dann mit: powershell.exe Dateiname
Eventuell ist aber auch noch ein Schalter notwendig, wenn man Admin-Rechte dafür benötigt, musst Du dann mal schauen.

MfG
ich will es nicht schedulen, sondern nur sporadisch mal bei Bedarf anschauen, wenn es nötig ist, dazu möchte ich eine Datei oder Verknüpfung auf dem Desktop ablegen und per Doppelklick starten.
So ganz klar ist mir das mit den Powershellskripten aber noch nicht... :confused:

wenn ich die obige Zeile in eine Textdatei mit dem Namen
chkdskscript.ps1
speichere und dann auf "Ausführen mit Powersript" klicke, passiert nur eine kurze eingeblendete Fehlermeldung (zu kurz um es lesen zu können).

Wie geht es richtig?

Moppi
28.03.2019, 12:10
Das Problem hatte ich auch. Ist es auf der Seite nicht beschrieben?
So kann man unter Windows zunächst die power-shell-Dateien nicht ausführen lassen, weil das unter Windows blockiert ist.
Hier noch ein Link wo es erklärt ist, wie es funktionieren soll: https://praxistipps.chip.de/windows-powershell-script-ausfuehren-so-gehts_41143


in PowerShelll Rechte ändern mit: Set-ExecutionPolicy ‹policy›
Bspw. set-executionpolicy unrestricted


Dann aufrufen mit bspw.: powershell.exe c:\windows\system32\chkdsk.ps1
Du kannst auf dem Desktop eine Textdatei anlegen, schreibst die Zeile dort rein und benennst die Extension der Datei, nach dem Speichern, in "cmd" um.
Danach kannst Du diese Datei auf dem Desktop doppelklicken und sie wird ausgeführt. Bei mir erscheint dann die CHKDSKResults.txt auf dem Desktop, weil die bei mir in der PS1-Datei ohne Pfad drin steht. Dann wird die Datei dort erstellt, wo auch meine CMD-Datei liegt.

HaWe
28.03.2019, 13:03
ist mir iwie zu verworren...

wo soll ich das reinschreiben?
an den Anfang einer .BAT Datei?
So?

[chkdskscript.ps1]

get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file d:\CHKDSKResults.txt


[powershell_exe.bat]

Set-ExecutionPolicy unrestricted
powershell.exe chkdskscript.ps1

(beide, also .BAT und .ps1, liegen auf d:\ )
das klappt nicht, da kommt nichts sichtbares außer einer wieder nicht lesbaren Fehlermeldung

auch wenn ich erst Powershell aufrufe, dann eingebe
Set-ExecutionPolicy unrestricted
dann Powershell beende und dann die .BAT Datei aufrufufe (ohne die 1. Zeile): wieder nur kurze unlesbare Fehlermeldung.

Wie muss die .BAT Datei richtig aussehen (getestet), damit sie direkt ausführbar ist, ohne dass ich vorher erst Powershell gesondert aufrufen muss?

Moppi
28.03.2019, 13:38
1. Power Shell rechte ändern, PowerShell aufrufen, Eingabe Rechte ändern vornehmen. Beispiel:


Windows PowerShellCopyright (C) 2009 Microsoft Corporation. Alle Rechte vorbehalten.


PS C:\Windows\system32> set-executionpolicy unrestricted


Ausführungsrichtlinie ändern
Die Ausführungsrichtlinie trägt zum Schutz vor nicht vertrauenswürdigen Skripts bei. Wenn Sie die Ausführun
ändern, sind Sie möglicherweise den im Hilfethema "about_Execution_Policies" beschriebenen Sicherheitsrisi
ausgesetzt. Möchten Sie die Ausführungsrichtlinie ändern?
[J] Ja [N] Nein [H] Anhalten [?] Hilfe (Standard ist "J"): j
PS C:\Windows\system32>


2. Auf dem Desktop eine Datei anlegen: chkdsk.txt
Diese Datei öffnen, mit einem Texteditor.

3. In den Texteditor eingeben: powershell.exe c:\windows\system32\chkdsk.ps1
Dabei Deinen eigenen Pfad für chkdsk.ps1 verwenden, wo immer Deine PS1-Datei steht.

4. Textdatei speichern.

5. Auf dem Desktop die Datei chkdsk.txt in chkdsk.cmd umbenennen.

6. chkdsk.cmd auf dem Desktop doppelt anklicken.




- - - Aktualisiert - - -

Inhalt der PS1-Datei bei mir:


get-winevent -FilterHashTable @{logname="Application"; id="1001"}| ?{$_.providername –match "wininit"} | fl timecreated, message | out-file CHKDSKResults.txt

HaWe
28.03.2019, 13:39
update:
das hatte ich so gemacht, hat aber nicht geklappt.
Der Fehler war:
PS braucht den Dateipfad d:\ , auch wenn es im aktuellen Verzeichnis liegt wie die .BAT Datei, also

[powershell_exe.bat]

powershell.exe d:\chkdskscript.ps1

so geht es jetzt, tausend Dank!