我使用下面的代碼輸出在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%
我使用下面的代碼輸出在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%
批處理不支持浮點運算。這將是一個很好的解決方法:
@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
這裏是一個解決方案,爲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%
您必須使用批處理命令嗎?你不能使用PowerShell?
[System.IO.DriveInfo]::GetDrives() | Where {$_.Name -eq 'C:\'} |
Select {$_.AvailableFreeSpace/1GB}
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.
)
)
可以使用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()
不工作的一些原因。給我下面的:https://www.dropbox.com/s/vpbbwufy3pij83m/Capture.PNG – user2040141
我看到,一批不支持浮點運算。這可能是一個解決辦法,只是修剪的最後9位......另一種可能,但更復雜的解決方案在這裏描述:[鏈接](http://www.celticproductions.net/articles/11/batch+files/add+浮動+點+中+批次+ file.html) – bpoiss
號碼+編輯我的回答,現在它應該工作 – bpoiss