gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:45:12 29 4
gpt4 key购买 nike

我想在依赖于我的可用存储空间的批处理文件中执行操作,但它失败了(有趣的是,只是有时),因为可用空间超过 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com