6

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

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

但在 freespace.log 文件中输出。

FreeSpace    
9772687360   
57401442304  
7346626560   
0            
0            

我只需要选择整数和求和。像这样求和输出后。

74520756224

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

4

4 回答 4

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%
于 2012-10-28T13:42:06.497 回答
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"
于 2012-10-28T07:37:39.850 回答
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 位数字。这样,您可以使用兆字节而不是字节进行计算,但(显然)会丢失一些精度,因为该值被截断(并且未正确舍入)。

于 2012-10-28T13:05:17.530 回答
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%
于 2015-10-27T00:26:47.753 回答