2012-10-28 3 views
6

Ich versuche, Integer von freiem Speicherplatz in Batch-Datei zu bekommen. Dies ist ein (sehr) einfacher Code.Wie bekomme ich eine ganze Menge freien Speicherplatzes in der Batch-Datei?

@echo off 
wmic logicaldisk get freespace >> freespace.log 
exit 

Aber Ausgabe in der Datei freespace.log.

FreeSpace  
9772687360 
57401442304 
7346626560 
0    
0    

Ich brauche nur Integer und Summierung. Nach der Summenausgabe wie folgt.

74520756224 

Ich suche auf Google als meine besten, aber ich kann keine Lösungen finden. Bitte helfen Sie mir :)

+3

Ich habe keine Ahnung, wie dieses Skript in Batch zu tun, ein VBScript oder ein JScript würde sehr einfach sein. – rekire

+1

Batch kann nicht mit Zahlen arbeiten größer als ~ 2 Gigabyte (es sei denn, Sie schreiben Ihre eigenen Addition Routinen - lächerlich Menge an Code und Arbeit), so dass Sie kein Glück haben. Sie sollten wirklich powershell, vbscript oder jscript verwenden. – dbenham

+0

Da Sie WMIC nicht als eine Anforderung erwähnt haben, nehme ich an, dass es nur als Ihr Versuch für eine Lösung enthalten war. Leider haben es alle unten aus irgendeinem Grund als Voraussetzung angesehen und in ihren Antworten verwendet. WMIC ist nicht ideal, da es im Vergleich zum nativen Batch-Interpreter eine schlechte Leistung aufweist. [Diese Lösung] (http://stackoverflow.com/a/7304937/119540) hat eine viel bessere Leistung, weil sie alle externen Programme vermeidet. – Synetech

Antwort

4

Hier ist eine genaue Lösung mit Hybrid Batch und Powershell. Es sollte wirklich mit reinem Powershell, Vbscript oder Jscript gemacht werden.

Die nicht intuitive Verwendung von Tokens und der IF-Anweisung soll die seltsame Interaktion zwischen FOR/F und der Unicode-Ausgabe von WMIC kompensieren.

@echo off 
setlocal enableDelayedExpansion 
set /a freeSpace=0 
for /f "skip=1 tokens=1,2" %%A in ('wmic logicaldisk get freespace') do (
    if "%%B" neq "" for /f %%N in ('powershell !freeSpace!+%%A') do (
    set freeSpace=%%N 
) 
) 
echo freeSpace=%freeSpace% 
+0

Ich habe es geschafft! Vielen Dank: D – nakorndev

+1

Wow, WMIC und PowerShell in der gleichen Batch-Datei, um nur den freien Speicherplatz zu erhalten. Ich nehme an, dass Leistung nicht Ihre primäre Sorge ist, ist es? Fancy-Pants-Lösungen wie diese gehören zu [CodeGolf] (http://codegolf.stackexchange.com/) mehr als hier, wo Leistung erwünscht ist. – Synetech

1

Verwenden Sie den folgenden Code. Versuchen Sie, den caption Text durch deviceid zu ersetzen, wenn ? oder leer angezeigt wird.

@echo off 
setlocal 
set drive=C 
set free=? 
rem Note: WMIC will output unicode text 
wmic logicaldisk where (caption = "%drive%:") get freespace>"%temp%\free.tmp" 
for /f %%A in ('type "%temp%\free.tmp"') do (set free=%%A) 
echo Free space: %free% bytes 
rem if exist "%temp%\free.tmp" del "%temp%\free.tmp" 
+0

Danke für die Antwort. Ich habe versucht, Ihre Antwort zu tun, aber es funktioniert nicht. Es hat sich gezeigt, dass "es zu dieser Zeit unerwartet war". und dann hat das Fenster geschlossen. – nakorndev

+0

Entschuldigung, dafür. Es wurde behoben. – Jay

+0

Danke für die Antwort. Es funktioniert jetzt, aber ich möchte summieren freie Festplattenspeicher aller Volumes auf Computer. :) – nakorndev

1

Ich zweite @ dbenham Empfehlung, zu PowerShell (oder mindestens VBScript oder JScript) zu wechseln. Wenn Sie jedoch mit einer Charge halten wollen und nicht genaue Zahlen müssen Sie etwas tun könnten:

@echo off 

setlocal EnableDelayedExpansion 

for /f %%v in ('wmic logicaldisk get freespace ^| findstr /r "[0-9]"') do (
    set val=%%v 
    set val=!val:~-6! 
    set /a sum+=val 
) 

echo !sum! 

endlocal 

Die Linie set val=!val:~-6! entfernt die letzten 6 Ziffern von jedem Wert. Auf diese Weise können Sie mit Megabyte anstelle von Byte rechnen, verlieren aber (offensichtlich) an Genauigkeit, da der Wert abgeschnitten (und nicht richtig gerundet) wird.

1

Hier eine reine Batch-Lösung ist, die Zahlen, die größer als ~ 2G verarbeiten kann:

@echo off 
setlocal EnableDelayedExpansion 
set /A "SUMMEG=0" & set /A "SUMONE=0" 
set /A "NUM=6" & set "ZER=000000" 
for /F "tokens=2 delims==" %%F in (' 
    wmic LOGICALDISK GET FreeSpace /VALUE 
') do (
    for %%G in (%%F) do (
     set "ONE=%ZER%%%G" 
     for /F "tokens=* delims=0" %%H in ("!ONE:~,-%NUM%!") do set "MEG=%%H" 
     for /F "tokens=* delims=0" %%H in ("!ONE:~-%NUM%!") do set "ONE=%%H" 
     set /A "SUMMEG+=MEG" & set /A "SUMONE+=ONE" 
    ) 
) 
if not "!SUMONE:~,-%NUM%!"=="" (set /A "SUMMEG+=!SUMONE:~,-%NUM%!") 
set "SUMONE=%ZER%!SUMONE!" & set "SUMONE=!SUMONE:~-%NUM%!" 
for /F "tokens=* delims=0" %%H in ("%SUMMEG%%SUMONE%") do set "FRE=%%H" 
endlocal & if "%FRE%"=="" (set "FRE=0") else (set "FRE=%FRE%") 
echo %FRE% 
Verwandte Themen