string - 批处理 : Handle numbers above 2^32

标签 string windows batch-file int long-integer

我想在依赖于我的可用存储空间的批处理文件中执行操作,但它失败了(有趣的是,只是有时),因为可用空间超过 2GB,使得变量无法设置。

这是批处理文件:

cd "C:\Users\Fabian\Desktop\Screen Recordings\Auto"
for /F "usebackq delims== tokens=2" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace /format:value`) do (set FreeSpace=%%x)
if (%FreeSpace%) LSS (2499522027520) (
for /F "delims=" %%a in ('dir /b /a-d /t:w /o:d "C:\Users\Fabian\Desktop\Screen Recordings\Auto\*.flv"') do (
del "%%a"
goto :breakLoop
))
:breakLoop
exit

很多这只是 Windows 怪异的解决方法,重要的部分是:set FreeSpace=%%x
x 是一个直接从事件磁盘数据中提取出来的字符串,它应该被转换成一个数字,但是因为它大于 232,所以失败了(并且它使一个字符串,使下一行的比较成为字符串比较,这根本不是我想要的)。
我也不能将它除以一个数字,因为那首先需要它是一个数字。

我是否必须通过更改字符串的长度来使用在末尾截断数字的粗略技巧(如果是,怎么办?)或者是否有适当的long 批处理文件中的数字?

我找到了 this script ( archive ) 实际上有效,但我不知道如何。它的哪一部分砍掉了数字,哪一部分是我需要的重要部分?我不能让它每次都汇总所有文件夹大小,因为脚本每 20 秒运行一次。

最佳答案

在 Windows 命令提示符下无法处理超出 -231 = -2147483648 到 231 的带符号 32 位整数范围的数字- 1 = 2147483647。

但是您可以使用 sub-string expansion 删除几个数字,比如说 6,在右边有一个四舍五入的兆字节数而不是字节数,并将结果用于数字比较,如下所示:

cd "%USERPROFILE%\Desktop\Screen Recordings\Auto"
set "FreeSpace=0"
for /F "usebackq skip=1" %%x in (`wmic logicaldisk where "DeviceID='C:'" get FreeSpace^,Size`) do (set "FreeSpace=%%x")

rem // Remove the last 6 digits to get MBytes:
set "FreeSpaceMB=%FreeSpace:~,-6%"
rem // Ensure to not leave an empty value behind:
if not defined FreeSpaceMB set "FreeSpaceMB=0"

if %FreeSpaceMB% LSS 2499522 (
    for /F "delims=" %%a in ('dir /B /A:-D /T:W /O:D "C:\Users\Fabian\Desktop\Screen Recordings\Auto\*.flv"') do (
        del "%%a"
        goto :breakLoop
    )
)
:breakLoop
exit /B

当然你会失去精度,但这对于手头的目的来说可能是可以接受的。

我还更改了捕获 wmic 输出的 for/F 循环,以避免出现孤立的回车 (CR) 字符等 Unicode 转换伪像,这会导致在变量 FreeSpace 中包含一个数字和一个 CR。这就是为什么我还查询了值 Size 的原因,虽然它不是必需的,但是 FreeSpace 值不是最后一个可能被 CR 拖尾的值。

顺便说一句,请注意我从 if 中删除了多余的括号命令行。

关于string - 批处理 : Handle numbers above 2^32,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47580182/

相关文章:

batch-file - Windows 上的 GitLab runner 和处理 & %ERRORLEVEL%

java - 如何在二维中使用字符串数组(String[][])并解析每个空间(指定元素点)中的数据?

string - 为什么最长公共(public)子串不是词干提取算法的解决方案?

swift - 在 Windows 10 上的 Ubuntu 上的 bash 上安装 swift 4

MySQL - 自动创建数据库、表和用户

svn - 在 Windows 上使用 post-commit Hook 触发 Jenkins 远程构建

java - 追加字符串 - 性能问题 - Java 6

c - 如何将字符串复制到 C 中的数组?

windows - 为什么文件操作在删除大型 NTFS 卷上的文件夹后挂起

c# - 如何从一个 Visual C# 项目构建两个不同的应用程序?