确定 C 盘是否有 2 GB 的可用磁盘空间

确定 C 盘是否有 2 GB 的可用磁盘空间

我正在尝试确定目标 PC 是否至少有 2 GB 的可用空间。以下是我目前所得到的:

@echo off
for /f "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do set "FreeSpace=%%x"
IF /i %FreeSpace% GTR "2147483648" (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)

无论我设置 2 GB 还是将其更改为 200 GB,它总是说我有足够的空间,即使这个驱动器只有 90 GB......如果可以的话,请帮忙。

这个问题正是我上述代码所基于的: 使用批处理命令检查可用磁盘空间

看起来应该可以工作但实际上却不行。

答案1

您的代码有两个问题:

1) 仅当两边的字符串计算结果均为数字时,IF 才进行数字比较。左侧是数字,但右侧有引号,这迫使整个比较必须使用字符串语义进行。数字的排序始终高于引号字符,因此它始终报告 TRUE。

正如 austinian 在他的回答中所建议的那样,删除引号显然可以在您的情况下给出正确的答案。但这并不是故事的全部!实际上它正在检查可用空间是否大于或等于 2147483647。

2) Windows 批处理(cmd.exe)数字限制为有符号的 32 位精度,相当于最大值 2 GB -1 字节(2147483647)。IF 语句有一个奇怪(也许不幸)的行为,即任何大于 2147483647 的数字都被视为等于 2147483647。因此,您不能使用您的技术来测试大于 2147483647 的值的可用空间。

https://stackoverflow.com/q/9116365/1012053了解更多信息。

链接的答案中描述了一种可用于测试大数的技术。您必须将条件的两侧左填充到相同的宽度,并强制进行字符串比较。

例如,下面将测试可用空间是否> = 4294967296(4 GB)

@echo off
setlocal
set "pad=000000000000000"
set "NeededSpace=%pad%4294967296"
for /f "delims== tokens=2" %%x in (
  'wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value'
) do for %%y in (%%x) do set "FreeSpace=%pad%%%y"
if "%FreeSpace:~-15%" geq "%NeededSpace:~-15%" echo Drive has at least 4 GB free space.

答案2

去掉"数字周围的 s,脚本几乎可以正常工作。使用 s"会强制进行字符串比较,而不是数字比较。

正如 dbenham 所指出的,CMD 仅将数字存储(和比较)为 32 位有符号整数。由于我们检查的是 GB,因此我们可以合理地忽略几个不太重要的数字。如果我们删除最后 6 位数字,那么我们仍然具有 MB 分辨率,同时能够正确检测最多 2 EB 的可用空间。此外,如上所述,由于末尾有一个额外的字符,我们必须从 WMIC 结果中修剪“删除的数字”+1。

@ECHO off
SETLOCAL EnableDelayedExpansion
FOR /f "usebackq delims== tokens=2" %%x IN (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) DO SET "FreeSpaceBig=%%x"
SET FreeSpace=!FreeSpaceBig:~0,-7!
IF %FreeSpace% GTR 2147 (ECHO C Drive Has Enough Available Disk For Install %FreeSpace%) else (ECHO C Drive Is FULL %FreeSpace%)
ENDLOCAL

注意:这里其实也不需要/i,因为它只是用于字符串比较,而我们进行的是整数比较。另外,如果您想避免为此操作调用 WMI(这允许我们省略并在第 4 行使用而不是),我们可以使用dir c:\ /-C | find "bytes free"而不是。无论如何,这是脚本,通常有很多方法可以完成工作。wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:valueEnableDelayedExpansion%!FreeSpaceBig

有关的:

https://stackoverflow.com/questions/293780/free-space-in-a-cmd-shell https://stackoverflow.com/questions/9099138/save-values-batch-file/9099542#9099542 https://stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working

答案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,这将会中断批处理文件的执行:

答案4

这是解决这个问题的另一种方法...但它不是很精确。

此方法对下列的“可用字节数”dir和驱动器属性使用字符串长度操作。

for /f "tokens=3" %%a in ('dir T:\') do (
 set bytesfree=%%a
)
ECHO %bytesfree%>x&FOR %%? IN (x) DO SET /A strlen=%%~z? - 2&del x
IF %strlen% LEQ 13 (

)

上面的具体例子是判断T盘的可用空间是否小于10GB。

我只是想向那些不喜欢大量代码的人分享这种非传统的解决方法。

相关内容