批处理:处理数字大于2 ^ 32

时间:2017-11-30 18:22:50

标签: 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是一个直接来自实时磁盘数据的字符串,应该转换为数字,但由于它大于2 32 ,因此失败(并且它使它成为一个字符串,在下一行比较一个字符串比较,这根本不是我想要的。) 我也不能将它除以一个数字,因为这需要它是一个数字。

我是否必须通过更改字符串的长度来使用最终切断数字的粗略黑客(如果是,怎么做?)或者是否有办法在其中包含正确的long个数字批处理文件?

我发现this scriptarchive)确实有效,但我不知道怎么做。它的哪一部分砍掉了数字,这是我需要的重要部分?我不能让它每次总结所有文件夹大小,因为脚本每20秒运行一次。

1 个答案:

答案 0 :(得分:2)

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

然而,您可以使用sub-string expansion(例如6)在右侧删除几个数字,以获得向下舍入数量的Mega-Bytes而不是Bytes,并使用结果进行数值比较,如下所示:

#!/bin/bash
  tmux \
     new-session "python long_expirement.py"
     detach-client

当然你会失去精确度,但这可能是可以接受的。

我还更改了捕获Microsoft.Compute/virtualMachines/write输出的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 循环,以避免像孤立回车(CR)字符这样的Unicode转换伪像,这会导致变量for /F包含一个数字加上一个CR。这就是为什么我查询了值wmic虽然不需要它,但FreeSpace值不是最后一个可能由CR尾标的值。

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