2012-10-28 12 views
6

मैं बैच फ़ाइल में मुफ्त डिस्क स्थान का पूर्णांक प्राप्त करने का प्रयास कर रहा हूं। यह मेरा (बहुत) सरल कोड है।बैच फ़ाइल में मुफ्त डिस्क स्थान का पूर्णांक कैसे प्राप्त करें?

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

लेकिन freespace.log फ़ाइल में आउटपुट।

FreeSpace  
9772687360 
57401442304 
7346626560 
0    
0    

मुझे केवल पूर्णांक और सारांश चुनने की आवश्यकता है। इस तरह के सारांश आउटपुट के बाद।

74520756224 

मैं Google पर अपनी सर्वश्रेष्ठ खोज करता हूं लेकिन मुझे समाधान नहीं मिल रहा है। कृपया मेरी मदद करें :)

+3

मैं कैसे बैच लिपि में यह करने के लिए पता नहीं है, एक VBScript या JScript बहुत आसान हो जाएगा। – rekire

+1

बैच ~ 2 गीगाबाइट से अधिक संख्याओं के साथ काम नहीं कर सकता है (जब तक कि आप अपनी खुद की अतिरिक्त दिनचर्या नहीं लिखते - कोड और काम की हास्यास्पद राशि), तो आप भाग्य से बाहर हैं। आपको वास्तव में पावरहेल, vbscript, या jscript का उपयोग करना चाहिए। – dbenham

+0

चूंकि आपने आवश्यकता के रूप में डब्लूएमआईसी का उल्लेख नहीं किया है, मुझे लगता है कि इसे सिर्फ समाधान के आपके प्रयास के रूप में शामिल किया गया था। दुर्भाग्यवश, नीचे दिए गए सभी ने इसे किसी कारण से आवश्यकता के रूप में लिया और इसे अपने उत्तरों में इस्तेमाल किया। डब्लूएमआईसी आदर्श नहीं है क्योंकि मूल बैच दुभाषिया की तुलना में इसका खराब प्रदर्शन है। [यह समाधान] (http://stackoverflow.com/a/7304937/119540) में काफी बेहतर प्रदर्शन है क्योंकि यह सभी बाहरी कार्यक्रमों से बचाता है। – Synetech

उत्तर

4

यहां हाइब्रिड बैच और पावरहेल का उपयोग करके एक सटीक समाधान है। यह वास्तव में शुद्ध शक्तिशक्ति, vbscript, या jscript के साथ किया जाना चाहिए।

टोकन और आईएफ कथन का गैर-सहज उपयोग फॉर/एफ और डब्लूएमआईसी के यूनिकोड आउटपुट के बीच अजीब बातचीत की भरपाई करना है।

@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

मैंने यह किया! बहुत बहुत धन्यवाद: डी – nakorndev

+1

वाह, डब्लूएमआईसी और पावरशेल उसी बैच फ़ाइल में केवल खाली स्थान प्राप्त करने के लिए। मैं इसे लेता हूं कि प्रदर्शन आपकी प्राथमिक चिंता नहीं है? इस तरह फैंसी-पैंट समाधान [कोडगोल्फ] (http://codegolf.stackexchange.com/) से अधिक हैं जहां प्रदर्शन वांछनीय है। – Synetech

1

नीचे कोड का उपयोग करें। टेक्स्ट को deviceid के साथ प्रतिस्थापित करने का प्रयास करें यदि यह ? या खाली दिखाता है।

@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

उत्तर के लिए धन्यवाद। मैंने आपका जवाब करने की कोशिश की है लेकिन यह काम नहीं कर रहा है। यह दिखाया गया है "इस समय अप्रत्याशित हो गया।" और फिर खिड़की बंद हो गई है। – nakorndev

+0

क्षमा करें, इसके लिए। यह तय किया गया है। – Jay

+0

उत्तर के लिए धन्यवाद। यह अब काम कर रहा है लेकिन मैं कंप्यूटर पर सभी वॉल्यूम्स के मुफ्त डिस्क रिक्त स्थान को सारांशित करना चाहता हूं। :) – nakorndev

1

मैं दूसरे @ dbenham की सिफारिश PowerShell (या कम से कम VBScript या JScript) स्विच करना। हालांकि, अगर आप बैच के साथ रहना चाहते हैं और सटीक संख्या की जरूरत नहीं है आप कुछ इस तरह कर सकता है यदि:

@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 

लाइन set val=!val:~-6! प्रत्येक मान से पिछले 6 अंक निकाल देता है। इस तरह आप बाइट्स के बजाय मेगाबाइट्स के साथ गणना कर सकते हैं, लेकिन (जाहिर है) कुछ परिशुद्धता खो देते हैं, क्योंकि मान छोटा कर दिया जाता है (और सही ढंग से गोल नहीं किया जाता है)।

1

यहाँ एक शुद्ध बैच समाधान है कि ~ 2 जी की तुलना में अधिक से अधिक संख्या को संभाल सकता है:

@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% 
संबंधित मुद्दे