在 DOS 批处理脚本中检查剩余的硬盘空间。如果条件不起作用

use*_*135 0 if-statement batch-file windows-7

我希望在硬盘空间不足时收到通知。我正在运行 Windows 7 Professional,我认为一个快速批处理文件可以处理这个问题。我会安排它每天运行一次。这是我到目前为止:

这将使用“dir”命令和“find”命令查找剩余的磁盘空间。它将值存储在 Var1 中。(这对我有用)

@echo off
FOR /F "tokens=*" %%i in ('dir ^| find "free"') do SET WinVer=%%i 
FOR /F "tokens=1-3 delims=]-" %%A IN ("%WinVer%" ) DO ( 
SET Var1=%%A 
)
Run Code Online (Sandbox Code Playgroud)

这会从结果中提取数字并删除逗号。结果看起来像没有引号的“111222333444”:(这对我有用)

set Var1=%Var1:~10,15%
set Var1=%Var1:,=%
Run Code Online (Sandbox Code Playgroud)

这会检查 Var1 中的值是否小于 100 GB(我假设的磁盘空间)。如果是这样,它会创建一个名为“lowSpace.txt”的文件,我稍后会看到。(这对我不起作用)

if %Var1% leq 100000000000 dir > lowSpace.txt
Run Code Online (Sandbox Code Playgroud)

这个“if”语句给我带来了问题。我的可用磁盘空间大约为 150 GB(或 150000000000),因此 if 条件应该失败并且“dir > lowSpace.txt”不应运行,但无论如何它都会运行。

  • 如果我将“if”语句中的常量从 100000000000 增加到 500000000000,就会按照我的预期创建文件“lowSpace.txt”。

  • 或者,如果我再次将常量从 100000000000 增加到 500000000000 并将条件从“leq”更改为“geq”,则在我希望不会创建文件“lowSpace.txt”时创建它。

我比较我的数字错了吗?还是我的“if”语句有问题?代码似乎认为 150 GB 大于和小于 100 GB。


这是我的完整脚本:

@echo off
FOR /F "tokens=*" %%i in ('dir ^| find "free"') do SET WinVer=%%i 
FOR /F "tokens=1-3 delims=]-" %%A IN ("%WinVer%" ) DO ( 
SET Var1=%%A 
) 
set Var1=%Var1:~10,15%
set Var1=%Var1:,=%

if %Var1% leq 100000000000 dir > lowSpace.txt
@echo on
@echo %Var1%
Run Code Online (Sandbox Code Playgroud)

请注意,100 GB 不是我真正的硬盘空间。我只是用这个数字来测试我的代码。

dbe*_*ham 5

我在Windows 批处理文件 IF 失败时问并回答了这个问题- 30000000000000 怎么等于 40000000000?. 您的问题是 Windows 批处理无法处理大于 ~2 GB 的数字。如果将任何大于 2 GB 的数字视为等于 2 GB。我发布了一个简单的解决方法,在数字前面加上零并强制进行字符串比较而不是数字比较。

请注意,您还可以使用 WMIC 获取任何给定驱动器的可用空间:

for /f "tokens=2" %%S in ('wmic volume get DriveLetter^, FreeSpace ^| findstr "^C:"') do set freeSpace=%%S
Run Code Online (Sandbox Code Playgroud)