我有一个 .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