Datenträger-/Partitionsgröße in Batchdatei abrufen

Datenträger-/Partitionsgröße in Batchdatei abrufen

Wie kommt manGesamtgrößeeiner Festplatte oder Partition (eine USB-Festplatte mit 1 NTFS-Partition) in einer Batchdatei?
Ich würde lieber keine Logik verwenden, die Dateien rekursiv durchgeht (die mit for /f), da es sich um eine 1-TB-Festplatte handelt und die Bestimmung der Größe lange dauern kann.

Ich bin offen für die Verwendung einiger kleiner Drittanbietertools, die die Größe der Batchdatei wiederherstellen.

PS: Ich verwende Windows 7 x64 Ultimate

Antwort1

Es gibt wahrscheinlich einen einfacheren Weg, dies zu tun, aber hier ist, was ich benutze

Wenn Sie nur die Bytes möchten, können Sie einfach diesen Befehl ausführen und T in den Laufwerksbuchstaben Ihres externen Geräts ändern (für einen Einzeiler in der Eingabeaufforderung ändern Sie %%in %und set space=in echo).

for /f "tokens=3 delims= " %%a in ('dir /-c T: ^| find "bytes free"') do set space=%%a

Wenn Sie das dann nehmen und vereinfachen möchten, legen Sie zunächst Richtlinien für jede Größe fest

set divide=1073741824&&set size=gigabytes
if %space% lss 1073741824 set divide=1048576&&set size=megabytes
if %space% lss 1048576 set divide=1024&&set size=kilobytes
if %space% lss 1024 set divide=1&&set size=bytes

Schreiben Sie dann ein temporäres VBS-Skript, da die Batchverarbeitung die Berechnungen nicht durchführen kann.

echo wsh.echo cdbl(%space%)/%divide% > %temp%\tmp.vbs

Führen Sie es aus, erfassen Sie das Ergebnis und löschen Sie es

for /f %%a in ('cscript //nologo %temp%\tmp.vbs') do set space=%%a
del %temp%.\tmp.vbs

Anschließend wird das Ergebnis auf zwei Dezimalstellen gekürzt

for /f "tokens=1,2 delims=." %%a in ("%space%") do (
  set s1=%%a
  set s2=%%b
)
if not "%s2%"=="" (set space=%s1%.%s2:~0,2%) else (set space=%s1%)

Echo-Ergebnisse

echo Drive has %space% %size% free.

[BEARBEITEN]

FürgesamtGröße, Sie können Diskpart List Volume verwenden (ändern "%%a"=="T"in "%%a"=="driveletterhere")

for /f "tokens=3,6,7 delims= " %%a in ('echo list volume ^| diskpart') do if "%%a"=="T" set size=%%b && set size2=%%c

und als Bonus, wie Sie das berechnen könnten:

if [%size2%]==[TB] (
    set isBigEnough=1
) else if [%size2%]==[GB] (
    if %size% GTR 31 set isBigEnough=1
)
if not defined isBigEnough set isBigEnough=0

Antwort2

Vielleicht versuchen Sie df.exe, welche verfügbar ist vonhttp://unxutils.sourceforge.net/und andere Standorte. Dies ist eine Kopie eines UNIX-Befehlszeilentools.

Sie sollten den Wert auch direkt von der Windows Management Interface (WMI) abrufen können. Allerdings fürchte ich, dass meine Kenntnisse auf diesem Gebiet nicht ausreichen, um eine direkte Antwort zu geben.

fsutil volume diskfree c:erhalten Sie drei Ausgabezeilen, die Sie wahrscheinlich verwenden können, findum das gewünschte Ergebnis zu erzielen.

Beispielausgabe:

Total # of free bytes        : 466333454336
Total # of bytes             : 972999880704
Total # of avail free bytes  : 466333454336

fsutil volume diskfree c: | find "Total # of bytes"gibt Ihnen eine bestimmte Linie.

for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

gibt Ihnen die Nummer mit einem vorangestellten Leerzeichen.

Zum Vergleich:

@REM 32MB = 32*1024*1024 bytes
@set COMP=33554432

@REM Pull out the line containing the number of bytes USED
for /F "tokens=2 delims=:" %i in ('fsutil volume diskfree c: ^| find "Total # of bytes"') do @set USED=%i

@REM Drop the leading space character to just get the number so a numeric comparison is done
for /F "tokens=1 delims= " %i in ('echo %USED%') do @set USED=%i

@REM Tell me something useful
if %USED% lss %COMP% @echo "Used is less than 32MB"
if %USED% gtr %COMP% @echo "Used is greater than 32MB"

HINWEIS: fsutil erfordert Administratorrechte und funktioniert daher möglicherweise nicht auf gesperrten Computern.

verwandte Informationen