Erledigt Batch-Hilfe gesucht...

Simukan

Bekanntes Mitglied
Kann mir jemand freundlicherweise eine Batch-Datei für folgende Aufgabe schreiben?
Ich hcbe jetzt lange rumexperimentiert, aber ich bin leider zu blöd dafür. :o:icon_confused:

Es sollen alle im PC vorhandenen Partitionen nach folgendem Schema mit "fsutil dirty query c:" geprüft werden.

Wenn ein Laufwerk fehlerhaft ist soll eine Meldung kommen, welches Laufwerk fehlerhaft ist.

Danach soll dann eine JA/NEIN-Abfrage kommen, ob das Laufwerk nach dem Schema "chkdsk /F c:" korrigiert werden soll.

Wenn NEIN, dann soll abgebrochen werden, wenn JA soll "chkdsk /F c:" mit dem jeweiligen Laufwerksbuchstaben durchgefürt werden.

Danach soll das Laufwerk nochmal mit "fsutil dirty query c:" gecheckt werden, ob es fehlerfrei ist und die Meldung dazu ausgeben.

zur Info: es gibt aktuell die Laufwerke C:, D:, E:, F:, G:, H:, I:, J:, K, L:, M:, N: und P:
Toll wäre es, wenn es einfach wäre in der Batch ggf. Laufwerke hinzuzufügen- oder zu entfernen.
Muss aber nicht sein.
 

sPIfF c99

fearless spaceman
Theoretisch sollte es so gehen

Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
if not %errorlevel% == 0 choice /M "Soll Laufwerk %%a geprueft werden" && if %errorlevel% == 1 chdsk /f %%a
)
pause

Das CMD muss als adm gestartet werden
 
Zuletzt bearbeitet:

Simukan

Bekanntes Mitglied
@sPIfF c99
Super, das Du dich der Sache annimmst. Vielen Dank! :)

Ich habe das jetzt mal getestet... klappt aber nicht ganz.
Das "fsutil dirty query %%a:" wird korrekt ausgeführt und es wird das Ergebnis für alle Partitionen angezeigt.
Auch wenn eine fehlerhaft ist, wird das korrekt angezeigt.

Danach passiert - im Falle einer fehlerhaften Partition - aber nichts mehr

Nebenbei:wenn du das testen willst:
fsutil dirty set x: setzt das Dirty-Bit beispielsweise für das Laufwerk X:
Dann kannst du die Batch testen.
Danach kannst du das Dirty-Bit wieder mit chkdsk /F x: entfernen.
Ist bloss blöd zu testen wenn man nur eine Partition hat. Dann muss Windows nämlich neustarten um chkdsk /f auf der Systempartition auszuführen.
Ist zum testen suboptimal.

@GiveThatLink

Gehst du davon aus, dass eines deiner Laufwerke demnext den Geist aufgibt?

Nein. Ich habe hier ein ganz spezielles Problem, das ich hier jetzt nicht so einfach in schriftliche Worte fassen kann.

Und dir ist bewusst, dass fsutil dirty im Fehlerfall autochk (beim Systemneustart) ausführt, ob du willst oder nicht?

Ja, ich weiss.
Ich möchte mir hier was automatisieren, was ich aktuell immer manuell mache.

 
Zuletzt bearbeitet:

sPIfF c99

fearless spaceman
Leicht angepasst:
Sicher fehlten oben 2 :

Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
if %errorlevel% == 0 goto :eof
choice /M Soll Laufwerk %%a: geprueft werden?
if %errorlevel% == 2 goto :eof
chdsk /f %%a:
)
pause
 
Zuletzt bearbeitet:

Simukan

Bekanntes Mitglied
@sPIfF c99

Klappt immer noch nicht.
Es kommt nur die Meldung: Volume - c: ist NICHT fehlerhaft.
Sonst nix. Auch nicht wenn eine Partition fehlerhaft ist.
Bei der ersten Version hats immerhin alle Laufwerke angezeigt.
 

Simukan

Bekanntes Mitglied
@sPIfF c99

Ich prüfe hier mit

Code:
@echo off
fsutil dirty query p:

echo Wenn Fehler vorliegen..
echo.
echo    J=Pruefung, N=Keine Pruefung
echo.
CHOICE /c:JN
IF ERRORLEVEL 2 GOTO EOF
IF ERRORLEVEL 1 GOTO PRUEF

goto EOF

:PRUEF
chkdsk /F p:
echo.
echo.
echo.

fsutil dirty query p:
goto EOF

:EOF

Das funktioniert bei mir einwandfrei. Ist halt leider nur für eine Partition (P).
 
Zuletzt bearbeitet:

galaxy500

Korinthenkacker!
Ich lese da
IF ERRORLEVEL 2 GOTO NOPRUEF
Es gibt aber keine Sprungmarke NOPRUEF.
Daher sollte es wohl besser EOF heissen, oder?

Sauber bleiben!
 

GiveThatLink

Bekanntes Mitglied
fsutil dirty query hat keinen eigene errorlevel, 0 ist nur die Info, dass der Befehl erfolgreich ausgeführt wurde, beinhaltet aber kein Ergebnis wie hier:
Code:
C:\>fsutil dirty query e:
Volume - e: ist NICHT fehlerhaft.
Entweder den Text von fsutil in eine pipe >x:\datei.log schreiben oder anders abgreifen, falls machbar.
Und jener Text ist hier auf deutsch, weil Windows auf deutsch, auf Kisuaheli muss das entsprechend abgefragt werden.

Siehe auch
https://www.winfuture-forum.de/index.php?showtopic=180006
 

sPIfF c99

fearless spaceman
So könnte es klappen:

if not "%%d" == "NICHT"
NICHT ist für deutsches OS


Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        setlocal EnableDelayedExpansion
        choice /M "Soll Laufwerk %%a: geprueft werden"
        if %errorlevel% == 1 chkdsk /f %%a:
        endlocal
        )
    )
)
pause
 
Zuletzt bearbeitet:

Simukan

Bekanntes Mitglied
@sPIfF c99

Du kommst der Sache näher. :yo

Jetzt gibt es zwar keine Meldung über die Partitionen, die in Ordnung sind, aber...
jetzt zeigt es iie markierte Partition korrekt an.
Dann erwartet es einen Tastendruck (pause) und es passiert danach wieder nichts.

1623996577816.png


BTW: In deiner Batch ist chkdsk immer falsch geschrieben. (chdsk)
 

sPIfF c99

fearless spaceman
@Simukan
Ich habe noch eine kleine Änderung gemacht, es macht nun 2x fsutil, einmal mit Ausgabe vom Text und 1x für die Schleife ohne Ausgabe
Bezüglich Checkdisk ist mir ein Schreibfehler unterlaufen, das k fehlte.
Nun ist beides oben angepasst
 
Zuletzt bearbeitet:

sPIfF c99

fearless spaceman
Bitte führe mal diesen Batch aus:

Code:
@echo off
for %%a in (c d) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        choice /M "Soll Laufwerk %%a: geprueft werden"
        echo %errorlevel% & if %errorlevel% == 1 chkdsk /f %%a:
        )
    )    
)
pause

Ich müsste wissen wie der errolevel ist nach Soll Laufwerk...
 

Simukan

Bekanntes Mitglied
Wie in der vorherigen Version:
1624000266972.png



Allerdings wird eine 0 ausgegeben.
(ich habe in Zeile 2 noch die Laufwerke ergänzt, du hattest da nur c+d drin)
 

sPIfF c99

fearless spaceman
Das ist ein Problem mit den 2 Schleifen in der Subroutine
Wie sieht es nun aus?

Code:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%a in (c d) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        setlocal EnableDelayedExpansion
        choice /M "Soll Laufwerk %%a: geprueft werden"
        echo %errorlevel% & if %errorlevel% == 1 chkdsk /f %%a:
        endlocal
        )
    )  
)
endlocal
pause
 

sPIfF c99

fearless spaceman
OK, alternative Lösung:

Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        :frage
        set frage="Soll Laufwerk %%a: geprueft werden (j/n) "
        if "%frage%" == "" goto frage
        if /i "%frage%" == "j" chkdsk /f %%a:
        )
    ) 
)
pause
 

sPIfF c99

fearless spaceman
Mist, da war noch was falsch

Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        :frage1
        set "frage="
        set /p frage="Soll Laufwerk %%a: geprueft werden (j/n) "
        if "%frage%" == "" goto frage1
        if /i "%frage%" == "j" chkdsk /f %%a:
        )
    )    
)
pause
 
Zuletzt bearbeitet:

Simukan

Bekanntes Mitglied
@sPIfF c99

Jetzt kommt in jedem Fall ""Laufwerk" kann syntaktisch an dieser Stelle nicht verarbeitet werden." Sonst gar nichts.

Alleine wenn ich die Batch aufrufe, egal ob was fehlerhaft ist- oder nicht.
 

sPIfF c99

fearless spaceman
Nun habe ich meinem USB Stick das Dirty Bit zugeordnet (fsutil dirty set x: )
So kann ich auch den ganzen Batch testen. Nach einigen Versuchen klappt es nun bei mir, inklusive chkdsk.

Verschachtelte Schleifen muss man genau checken, wenn man diese nicht regelmässig macht.

Code:
@echo off
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        :frage1
        set lw=%%a:
        setlocal EnableDelayedExpansion
        set "frage="
        set /p frage="Soll das Laufwerk !lw!: geprueft werden (j/n) "
        if "!frage!" == "" goto frage1
        if not exist !lw! goto :eof
        if /i "!frage!" == "j" chkdsk /f !lw!
        endlocal
        )
    )
)
pause
 

Simukan

Bekanntes Mitglied
WOW! Ich verneige mich tief und drücke menen allergrößten Dank aus!

Jetzt funktioniert es einwandfrei. :yo

Sogar, wenn mehere Laufwerke fehlerhaft markiert sind. Perfekt!
Das hätte ich nie hinbekommen. Ich kann mir ja auch ganz gut helfen, aber dafür war ich - wie ich oben schon geschrieben habe - zu "blöd".

Vielen Dank, du hast mir sehr geholfen.
 

sPIfF c99

fearless spaceman
Nun noch leicht bereinigt (überflüssiges : entfernt) und Umlaute eingeführt..


Code:
@echo off
::-------------
chcp 65001 >NUL
set ueg=Ü
set ue=ü
::-------------
for %%a in (c d e f g h i j k l m n p) do (
fsutil dirty query %%a:
    for /f "tokens=5" %%d in ('fsutil dirty query %%a:') do (
        if not "%%d" == "NICHT" (
        set lw=%%a:
        :frage1
        setlocal EnableDelayedExpansion
        set "frage="
        set /p frage="Soll das Laufwerk !lw! gepr!ue!ft werden (j/n) "
        if "!frage!" == "" goto frage1
        if not exist !lw! goto :eof
        if /i "!frage!" == "j" chkdsk /f !lw!
        endlocal
        )
    )
)
echo.
echo.
echo Die %ueg%berpr%ue%fung ist beendet.
echo.
echo.
pause
 
Zuletzt bearbeitet:

Simukan

Bekanntes Mitglied
Kleine Ergänzug:
Ich nutze in der DOS-Box den Font "Lucida Console".
Die Umlaute werden mit "chcp 65001 >NUL" bei mir nicht richtig angezeigt.
Mit "chcp 1252 >NUL" passt es.
 
Zuletzt bearbeitet:
Oben Unten