alex76
Goto Top

Win10-Batch: div. Fragen zur Entwicklung einer chkdsk Batch

Hallo Zusammen,

ich entwickle derzeit für meinen Privatgebrauch und Freunde eine Disk-Management-Batch (chkdsk, defrag, stordiag, sdelete) nach dem NTFS-Health-Modell mit optimierten Befehlszeilen.

Hierzu habe ich ein paar Verständnisfragen:

I. chkdsk (nur NTFS) Parameter /spotfix:

Mein Plan ist es "chkdsk %_DriveLetterX% /V /sdcleanup /spotfix" optimal nutzen zu können, wobei %_DriveLetterX% ein vom User im Vorfeld eingegebener Laufwerksbuchstabe ist (z.B. "C:"). "Geplante Optimierung" (in dfrgui.exe) ist ausgeschaltet. Spotfix greift auf vorherig protokollierte Scanergebnisse zurück und führt eine Reparatur anhand der protokollierten Fehler durch anstatt jede Datei einzeln zu prüfen und führt somit zur Reparatur in höchstmöglicher Geschwindigkeit. Nun wüsste ich gerne explizit, ob ein im Vorfeld ausgeführtes

chkdsk %_DriveLetterX% /scan /V /perf
hierzu ausreicht oder ob ich

chkdsk %_DriveLetterX% /scan **/forceofflinefix** /V /perf


benötige, um die Fehler schon vorab für die Offline-Reparatur einzustellen. Oder wäre das sogar doppelt, da ja auch /spotfix eine Aufgabe für die Offlinereparatur anlegt? Im Netz finde ich sehr widersprüchliche Informationen hierzu und selbst kann ich es derzeit nicht testen, da keine Fehler vorhanden sind und somit keine Einstellung für den Offline-Fix erfolgt.

II. Fixierung eines Volumes in der Registrierung, dessen Laufwerksbuchstabe via Batch zugeteilt wurde

Das Programm soll die Möglichkeit bieten, "versteckten" Volumes einen Laufwerksbuchstaben zuzuteilen, um diese auch optimieren zu können. Bei mir sind das die Recovery und die System Partition. Ja ich habe die Recovery wieder ausgelagert, da ich winre.wim mit eingebautem DaRT10 als RAM-Disk laufen lasse und so beim Booten via Startmenü aufrufen kann. face-smile
%_DriveLetter% ist der Laufwerkbuchstabe ohne ":".
Der erste Schritt hierfür ist:

(echo Rescan
echo List Disk
echo Select Disk 1
echo List Partition
echo Select Partition 1
echo Assign letter="%_DriveLetter%"  
)  | diskpart

Allerdings ist mir aufgefallen, dass wmic den Laufwerksbuchstaben nach erfolgter Diskpart-Zuweisung trotzdem nicht findet. Vermute es liegt an der fehlenden Fixierung des Laufwerksbuchstabens in der Registrierung unter \HKLM\SYSTEM\MountedDevices. Gibt es eine Möglichkeit, diese über cmd manuell nachzuholen, ohne Gefahr zu laufen, sich die Zuweisung zu zerschießen?

Beispielsweise indem ich die Fixierung einmal in der Datenträgerverwaltung manuell erledige, um dann die Fixierungsbinary ( bspw. \\DosDevices\\Rface-smile als .reg zu exportieren, um diese dann in der Batch via
reg add /v /t /d /f 
wieder hinzufügen zu können?

Die .reg sähe so aus:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices]
"\\DosDevices\\R:"=hex:44,4d,49,4f,3a,49,44,3a,b2,c8,a1,bd,0d,ef,c1,4a,92,d3,\  
  61,58,d2,c7,6c,64

Könnte ich diese also gefahrlos einfach importieren und wie wieder entfernen?
Oder via reg
reg add HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices /v "\\DosDevices\\R:" /t REG_BINARY /d "hex:44,4d,49,4f,3a,49,44,3a,b2,c8,a1,bd,0d,ef,c1,4a,92,d3,61,58,d2,c7,6c,64" /f  
?

III. Chkdsk nach volume GUID:

Ich könnte chkdsk auch über die volume GUID anstatt Laufwerksbuchstaben laufen lassen.
Die Bereitstellungspunkte bekomme ich via:
powershell -command "GWMI -namespace root\cimv2 -class win32_volume | Select Label, DeviceID, FileSystem, DriveLetter"  
. Hierzu müsste ich nach "Label" suchen und mir die DeviceID ausgeben lassen.

Wie kann ich hierfür eine FOR /F Schlaufe nutzen, die nach der Variable %_LabelX% (die Laufwerksbezeichnung) sucht und mir die DeviceID (ohne letzten Backslash \!) in die neue Variable %_DeviceIDX% ausgibt? Das bekomme ich nicht hin face-sad

EDIT:
Ich möchte als Ergebnis der FOR /F Schleife
\\?\Volume{4e0a0d00-0000-0000-0002-000000000000} anstatt
\\?\Volume{4e0a0d00-0000-0000-0002-000000000000}\
Kann man so eine Zeichenfolge überhaupt als Variable speichern? Bekomme bei Echo %_DeviceIDX% nun immer "ECHO ist ausgeschaltet (OFF)." anstatt den Inhalt der Variable.

Vielen Dank für die Hilfe!
Die fertige Batch stelle ich gerne zur Verfügung, wenn fertig.

Content-Key: 658239

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

Ausgedruckt am: 29.03.2024 um 09:03 Uhr

Mitglied: alex76
alex76 03.03.2021 um 17:00:47 Uhr
Goto Top
Hmmm zu Frage III ist mir eine ganz umständliche aber funktionierende Variante über einen Text-Export eingefallen. Ich habe mal HDD1 als Laufwerksbezeichnung per Hand eingetippt, um zu testen:

@ECHO OFF
::gibt das Ergebnis in die test.txt-Datei weiter
powershell -command "GWMI -namespace root\cimv2 -class win32_volume | Select Label, DeviceID, FileSystem, Caption > test.txt  

::Ändert den Separator in Komma
SET "Delim=,"  
FOR %%F in (.\test.txt) do (
  ( FOR /F "eol=*tokens=1-4" %%A IN ('type %%F') DO @Echo=%%A%Delim%%%B%Delim%%%C%Delim%%%D  
  ) >"%%~nF1.txt"  
)

::Setzt die DeviceID vom Laufwerk HDD1 in die Variable %_DeviceIDX%
FOR /F "tokens=1,2,3,4 delims=," %%A IN ('findstr /I "HDD1" test1.txt') DO (  
       SET "_DeviceIDX=%%B" )  
:: Falls die Variable mit \ endet kürze sie um \
IF %_DeviceIDX:~-1%==\ SET _DeviceIDX=%_DeviceIDX:~0,-1%
ECHO %_DeviceIDX%

Geht das auch einfacher?