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

我试图确定目标PC是否有至less2 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)如果双方的string评估为数字,则只进行数字比较。 你的左边是数字,但你的右边有引号,这迫使整个比较使用string语义完成。 数字数字总是sorting高于一个引号字符,所以它总是报告TRUE。

正如奥斯汀在他的回答中所build议的那样,在你的情况下,除去引号显然给出了正确的答案。 但这不是整个故事! 实际上它正在检查空闲空间是否大于或等于2147483647。

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

有关更多信息,请参阅https://stackoverflow.com/q/9116365/1012053

在链接的答案中描述了一个可以用来testing大数字的技术。 必须将条件的两边都留出相同的宽度,并强制进行string比较。

例如,以下内容将testing可用空间是否大于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. 

从数字周围取出" s " ,脚本几乎可以正常工作,使用" s "进行string比较而不是数字比较。

正如dbenham所指出的那样,CMD只将数字存储(和比较)为32位有符号整数。 由于我们正在检查GB,所以我们可以合理地忽略几个不太重要的数字。 如果我们删除最后6位数字,那么我们仍然可以使用MB分辨率,同时能够正确检测到2Eb的可用空间。 另外,如上所述,由于最后还有一个额外的字符,我们必须修改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在这里,因为它只是用于string比较,而我们正在做整数比较。 另外,我们可以使用dir c:\ /-C | find "bytes free" 如果你想避免为这个操作调用WMI(这允许我们省略EnableDelayedExpansion并且使用%而不是!dir c:\ /-C | find "bytes free"而不是wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value FreeSpaceBig 4.无论如何,这是脚本,通常有很多方法来完成工作。

有关:

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

这是一个不同的方式去做…但它不是很精确。

此方法使用string长度操作对照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。

我只是想分享一些不太喜欢大量代码的非正规方法。