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

Her*_*erb 7 windows disk-space batch-file

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

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

但是,还有一个警告,到目前为止我无法处理。

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

甚至有可能吗?如果是这样,我需要研究什么命令?

Lot*_*ngs 12

我建议为此使用 PowerShell 脚本。

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

电源外壳

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

我必须批量扩展有关数字比较的上述信息
如果数字包含在等长字符串中,则它们可以作为字符串进行有效比较。
字符串比较逐个字符进行,前导空格/零小于 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
)
Run Code Online (Sandbox Code Playgroud)

示例输出:

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

> Check-FreeSpace.cmd
FreeSpace="  1181504520192"
   100 GB="   107374182400"
yes enough free space
Run Code Online (Sandbox Code Playgroud)


phu*_*clv 9

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

dir /-c /w C: | find "bytes free"
Run Code Online (Sandbox Code Playgroud)

您也可以直接通过获取3获得大小值RD令牌输出

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

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

最正确的方法是

wmic LogicalDisk where DeviceID='C:' Get FreeSpace /value
Run Code Online (Sandbox Code Playgroud)