4

我正在使用以下代码输出 C: 驱动器上的当前可用空间。如何使用批处理将输出从字节转换为 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%
4

5 回答 5

2

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

@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

它仅在您以管理员身份运行 .bat 时才有效。它只是在右边的 9 位之后插入一个点,并修剪最后 7 位。这与 windows 的值不完全匹配,因为 1k 在这里是 1000 而不是 1024

更好但更复杂的解决方案是使用 VBScript,如下文所述:文章

于 2013-02-04T15:50:27.277 回答
2

这是一个以整数形式给出 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%
于 2013-02-04T15:50:37.657 回答
0

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

[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -eq 'C:\'} |
Select {$_.AvailableFreeSpace/1GB}
于 2013-02-09T02:23:40.640 回答
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.
    )
)
于 2015-06-13T17:03:43.230 回答
0

可以使用StrFormatByteSize64()API 函数将 long int 转换为人类可读的大小。cmd与截断以满足环境的 32 位限制相比,这会产生更准确的值。此 API 函数支持从字节和千字节到 PB 和 EB 范围内的值。

(此脚本是 Batch + 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()
于 2017-03-28T16:09:52.190 回答