在 .bat 文件中,如何测试可用磁盘空间?

在 .bat 文件中,如何测试可用磁盘空间?

我有一个 .bat 脚本,它在启动专用备份服务器时启动,使用 Robocopy 保存生产环境,并在完成后关闭服务器。

它会在保存之前进行一些检查,并在出现问题时请求采取适当的措施,例如当由于关闭电源而未检测到目标 JBOD 案例时。

不过,还有一个警告,我目前还无法处理。

如何在 .bat 文件中测试目标磁盘上是否有足够的空间来接收所有文件?(测试固定空间大小并定期修改是可以的;目前接近 100 GB。)

这有可能吗?如果可以,我需要研究什么命令?

答案1

我建议为此使用 PowerShell 脚本。

wmic返回以字节为单位的大小,批处理仅限于有符号 32 位整数的次数比较,远低于 100GB。您必须先截断该数字。

电源外壳

if ((Get-WMIObject Win32_Logicaldisk -filter "deviceid='C:'").FreeSpace -gt 100GB){
  "yes enough free space"
} else {
  "not enough free space"
}

我必须扩展上述有关批量数字比较的信息
如果数字包含在等长字符串中,则可以将它们作为字符串进行有效比较。
字符串比较是逐个字符进行的,前导空格/零小于 1。

目前最大的硬盘大小为 10TB = 10995116277760 字节,占小数点后 14 位 - 以下批次所有数字均使用 15 位。

@Echo off
Rem        543210987654321
Set "Blank=               "
Set "GB100=   107374182400"
Set "TB_10= 10995116277760"

for /f "tokens=2" %%A in (
  'wmic LogicalDisk Get DeviceID^,FreeSpace ^| find /i "C:"'
) Do Set "FreeSpace=%Blank%%%A"
Set "FreeSpace=%FreeSpace:~-15%"

Echo FreeSpace="%FreeSpace%"
Echo    100 GB="%GB100%"

If "%FreeSpace%" gtr "%GB100%" (
  Echo yes enough free space
) else (
  Echo not enough free space
)

示例输出:

> Check-FreeSpace.cmd
FreeSpace="   101606346752"
   100 GB="   107374182400"
not enough free space

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space

答案2

最简单的方法是查看dir输出的最后一行

dir /-c /w C: | find "bytes free"

您还可以通过获取输出中的第三个标记直接获取大小值

FOR /F "tokens=3 USEBACKQ" %%F IN (`dir /-c /w C:`) DO set "size=%%F"
echo %size%

但是它并不可靠,因为字符串在另一种语言中可能有所不同。还请注意,有时您有很多可用空间,但无法再写入任何文件,因为您已达到某些限制,例如最大文件大小或卷/目录中的最大文件数量...

最正确的做法是

wmic LogicalDisk where DeviceID='C:' Get FreeSpace /value

相关内容