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

Sea*_*gle 7 windows hard-drive disk-space-utilization batch windows-command-prompt

我正在尝试确定目标电脑是否至少有 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%)
Run Code Online (Sandbox Code Playgroud)

我是否设置 2 GB 或将其更改为 200 GB 都没有关系,它总是说我有足够的空间,即使这个驱动器只有 90 GB...如果可以,请提供帮助。

这个问题是我上面代码的基础: Check free disk space using Batch commands

似乎它应该工作,但它没有。

dbe*_*ham 13

您的代码有两个问题:

1) IF 仅在两边的字符串计算结果为数字时才进行数字比较。您的左侧是数字,但您的右侧有引号,这会强制使用字符串语义完成整个比较。数字总是排序高于引号字符,因此它总是报告 TRUE。

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

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

有关更多信息,请参阅/sf/ask/638145581/

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

例如,以下将测试可用空间是否 >= 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.
Run Code Online (Sandbox Code Playgroud)


aus*_*ian 3

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

正如 dbenham 所指出的,CMD 仅将数字存储(并比较)为 32 位有符号整数。由于我们正在检查 GB,因此我们可以合理地忽略几个不太重要的数字。如果我们删除最后 6 位数字,那么我们仍然具有 MB 分辨率,同时能够正确检测最多 2 艾字节的可用空间。另外,如上所述,由于末尾有一个额外的字符,我们必须从 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
Run Code Online (Sandbox Code Playgroud)

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

有关的:

/sf/ask/20564631/ /sf/ask/636939691/#9099542 https:// stackoverflow.com/questions/7769918/comparing-2-numbers-in-dos-batch-not-working