Windows命令行获取以GB为单位的磁盘空间


12

我正在尝试创建一个批处理文件,以提取服务器C:\驱动器的总大小和可用空间(本地运行脚本)。我还需要输出易于阅读,因此字节将无法工作,因此我可以使用创建临时.vbs文件的命令行。

以下内容似乎可以使用,但是格式/数学不正确。

setlocal
for /f "tokens=6" %a in ('fsutil volume diskfree C: ^| find "of bytes"') do set diskspace=%a
echo wsh.echo FormatNumber(cdbl(%diskspace%)/1024, 0) > %temp%.\tmp.vbs
for /f %a in ('cscript //nologo %temp%.\tmp.vbs') do set diskspace=%a
del %temp%.\tmp.vbs
echo For example %diskspace%

上面的命令也只显示了可用空间...我也希望总大小...想知道以下命令是否可能更适合提取信息:

WMIC LOGICALDISK GET Name,Size,FreeSpace | find /i "C:"

另请注意,我希望能够将其直接复制/粘贴到命令提示符中(而不是批处理文件-强制要求)。我已经从上面的代码中删除了“ %%”。

注意:需要在Server 2003+上本机运行(因此Powershell和其他任何第三方utils都已退出)。


什么版本的Windows?
EBGreen 2015年

Server 2003+本机。更新我的原始帖子以反映这一点。
BondUniverse

Answers:


10

在“ 非批处理文件-强制要求”子句下,下cmd一个单行代码可能会有所帮助:

for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FINDSTR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nologo %temp%\tmp.vbs & del %temp%\tmp.vbs

输出

==>for /f "tokens=1-3" %a in ('WMIC LOGICALDISK GET FreeSpace^,Name^,Size ^|FIND
STR /I /V "Name"') do @echo wsh.echo "%b" ^& " free=" ^& FormatNumber^(cdbl^(%a^
)/1024/1024/1024, 2^)^& " GiB"^& " size=" ^& FormatNumber^(cdbl^(%c^)/1024/1024/
1024, 2^)^& " GiB" > %temp%\tmp.vbs & @if not "%c"=="" @echo( & @cscript //nolog
o %temp%\tmp.vbs & del %temp%\tmp.vbs

C: free=79,11 GiB size=111,45 GiB

D: free=929,47 GiB size=931,51 GiB

==>

11

我意识到您现在正在看做VBS,但是PowerShell可以很容易地做到这一点:

$disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='C:'" | Select-Object Size, FreeSpace

Write-Host ("{0}GB total" -f [math]::truncate($disk.Size / 1GB))
Write-Host ("{0}GB free" -f [math]::truncate($disk.FreeSpace / 1GB))

第一行从WMI获取磁盘信息(在此示例中,C:也是如此),并仅选择“可用空间”和“总大小”。

在接下来的两行中,将“可用空间”和“总大小”写入控制台,格式为GB,小数部分被截断。

输出示例(原样):

223GB total
125GB free

1
忘了对此做个注释...需要它在Server 2003+上本机运行(由于Powershell在2003年不是本机,因此无法使用它)。当然,使用Powershell会更加容易!
BondUniverse

3

在批处理文件中,可以使用DiskPart脚本获取指定磁盘的磁盘大小(以GB为单位)。在此示例中,我将根据其型号名称设置特定的磁盘索引(假设计算机中只有一个类似的索引)。更改字符串“ SATA Disk ”以匹配磁盘驱动器的型号。您可以通过在cmd中运行命令“ wmic diskdrive get Model,Index ” 来获取模型名称。

当然,您可以在wmic命令中使用磁盘的其他属性-输入wmic diskdrive get /?。获取可以使用的所有磁盘属性的列表。

for /f %%I in ('wmic diskdrive get Model^, Index ^| find "SATA Disk"') do set DISK_Index=%%I

if not exist %~dp0Disk_Size.script (echo list disk > %~dp0Disk_Size.script)
@echo off
FOR /F "tokens=4 delims= " %%J in ('diskpart /s %~dp0Disk_Size.script ^| find "Disk %DISK_Index%"') do set DISK_SIZE=%%J
IF %ERRORLEVEL% EQU 1 (echo No Data was processed, cannot get DISK_SIZE)

echo DISK_SIZE is %DISK_SIZE% GB

3

如果您只需要检查驱动器是否有足够的可用空间(例如,以安装或复制某些内容),则可以尝试如下的wmic查询:

wmic LogicalDisk where "DeviceID='c:' and FreeSpace > 10737418240" get DeviceID 2>&1 ^ | find /i "c:" >nul || (echo not enough space&exit 1)

如果C上的可用空间少于10Gb,这将中断批处理文件的执行:


2

除以1024得到千字节(2 ^ 10)。除以1024 x 1024得到兆字节(2 ^ 20)。除以1024 x 1024 x 1024得到千兆字节(2 ^ 30)。

Windows出于历史原因将这些单位称为千字节,兆字节和千兆字节。我认为我的机壳是正确的。

所以改变你的总和。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.