2013-02-04 53 views
3

我使用下面的代码输出在C当前的可用空间:驱动器。如何使用批量将输出从字节转换为GB?如何将此原始字节输出转换为GB?

@echo off 
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get  FreeSpace /format:value`) do set FreeSpace=%%x 
echo %FreeSpace% 

回答

2

批处理不支持浮点运算。这将是一个很好的解决方法:

@setlocal enableextensions enabledelayedexpansion 
@echo off 

for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get  FreeSpace /format:value`) do set FreeSpace=%%x 

echo !FreeSpace:~0,-10!,!FreeSpace:~2,-8!GB 

它只有当你运行蝙蝠作为管理员的工作。它只是从右边的9位数字后面插入一个点,并修剪最后一个7.这与windows的值不完全匹配,因为1k在这里是1000而不是1024

更好但更复杂的解决方案是要使用VBScript,下面的文章中描述的:Article

+1

不工作的一些原因。给我下面的:https://www.dropbox.com/s/vpbbwufy3pij83m/Capture.PNG – user2040141

+0

我看到,一批不支持浮点运算。这可能是一个解决办法,只是修剪的最后9位......另一种可能,但更复杂的解决方案在这里描述:[链接](http://www.celticproductions.net/articles/11/batch+files/add+浮动+点+中+批次+ file.html) – bpoiss

+0

号码+编辑我的回答,现在它应该工作 – bpoiss

0

这里是一个解决方案,为GB的一个整数。可能不是你想要的,但是很容易做到,并且可以为你所需要的做出诀窍。我无法真正使用wmic为我工作,但wmic可能比dir更好。

@setlocal enableextensions enabledelayedexpansion 
@echo off 
for /f "tokens=3" %%a in ('dir c:\') do (
    set bytesfree=%%a 
) 
set bytesfree=%bytesfree:,=% 
endlocal && set bytesfree=%bytesfree% 

rem truncating end. loses precision 
set /a kb=%bytesfree:~0,-3% 
set /a mb = kb/1024 
set /a gb = mb/1024 
echo %gb% 

嗯,嗯,这里是用WMIC同样的事情。

@setlocal enableextensions enabledelayedexpansion 
@echo off 
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get  FreeSpace /format:value`) do set FreeSpace=%%x 

rem truncating end. losing precision 
set /a kb=%FreeSpace:~0,-4% 
set /a mb = kb/1024 
set /a gb = mb/1024 
echo %gb% 
0

您必须使用批处理命令吗?你不能使用PowerShell?

[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -eq 'C:\'} | 
Select {$_.AvailableFreeSpace/1GB} 
0

REM ECHO Disk Storage 

for /f "tokens=1" %%d in (
'wmic logicaldisk where drivetype^=3 get deviceid ^| find ":"') do ( 
    for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='%%d'" get Size /value`) do set Size=%%x 
    echo VolumeSize on %%d Partition = !Size:~0,-10!,!Size:~2,-8! GB >output.txt 
    for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='%%d'" get FreeSpace /value`) do set FreeSpace=%%x 
    echo Freespace on %%d Partition = !FreeSpace:~0,-10!,!FreeSpace:~2,-8! GB >> output.txt 
    echo. 
    ) 
) 
0

可以使用StrFormatByteSize64() API function为long int转换为人类可读的大小。这会比截断符合cmd环境的32位限制更精确。此API函数支持范围从字节和千字节到PB和EB的值。

(这个脚本是一种混合批次+ PowerShell脚本。有.BAT扩展名保存它。)

<# : batch portion 
@echo off & setlocal 

for /f "tokens=2 delims==" %%x in (
    'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /value' 
) do call :int2size FreeSpace %%x 

echo %FreeSpace% free on C: 

rem // end main runtime 
exit /b 

rem // batch int2size function 
:int2size <return_varname> <int> 
setlocal 
set "num=%~2" 
for /f "delims=" %%I in (
    'powershell -noprofile "iex (${%~f0} | out-string)"' 
) do endlocal & set "%~1=%%I" & goto :EOF 

: end batch/begin PowerShell #> 
Add-Type @' 
using System.Runtime.InteropServices; 
namespace shlwapi { 
    public static class dll { 
     [DllImport("shlwapi.dll")] 
     public static extern long StrFormatByteSize64(ulong fileSize, 
      System.Text.StringBuilder buffer, int bufferSize); 
    } 
} 
'@ 

$sb = new-object Text.StringBuilder 16 
[void][shlwapi.dll]::StrFormatByteSize64($env:num, $sb, 16) 
$sb.ToString() 
相关问题