2012-10-28 46 views
6

我正在尝试在批处理文件中获取可用磁盘空间的整数。这是我的(非常)简单的代码。如何在批处理文件中获取可用磁盘空间的整数?

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

但输出在freespace.log文件中。

FreeSpace  
9772687360 
57401442304 
7346626560 
0    
0    

我需要选择整数和求和。总结后输出如下。

74520756224 

我在谷歌搜索是最好的,但我找不到解决方案。请帮助我:)

+3

我不知道如何做到这一点的批处理脚本,一个VBScript或JScript中会很容易。 – rekire

+1

批处理不能使用大于〜2 GB的数字(除非您编写自己的附加例程 - 代码和工作量很大),所以您运气不好。你真的应该使用powershell,vbscript或jscript。 – dbenham

+0

由于您没有提及WMIC作为要求,我认为它只是包含在您的解决方案尝试中。不幸的是,下面的每个人都把它作为一些原因的要求,并在答案中使用它。 WMIC并不理想,因为它与本地批处理解释器相比性能较差。 [此解决方案](http://stackoverflow.com/a/7304937/119540)具有更好的性能,因为它避免了所有外部程序。 – Synetech

回答

4

下面是使用混合批处理和PowerShell的精确解决方案。它确实应该用纯粹的powershell,vbscript或jscript来完成。

令牌和IF语句的非直观使用是为了补偿FOR/F和WMIC的unicode输出之间的奇怪的相互作用。

@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

我做到了!非常感谢:D – nakorndev

+1

哇,WMIC和PowerShell在同一个批处理文件中仅仅获得可用空间。我认为表现不是你主要关心的吗?像这样的花式裤子解决方案属于[CodeGolf](http://codegolf.stackexchange.com/),比这里更需要性能。 – Synetech

1

使用下面的代码。如果显示?或空白,请尝试将caption文本替换为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

这是一个纯粹的批量解决方案,它可以处理数超过〜2G更大:

@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% 
相关问题