代码之家  ›  专栏  ›  技术社区  ›  Fabian Röling Dan Williams

批次:处理2^32以上的编号

  •  3
  • Fabian Röling Dan Williams  · 技术社区  · 7 年前

    我想根据可用存储空间在批处理文件中执行一个操作,但它失败了(有趣的是,只是有时会失败),因为可用空间超过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 script ( archive )这确实有效,但我不知道怎么做。它的哪一部分去掉了数字,哪一部分是我需要的重要部分?我不能让它每次汇总所有文件夹大小,因为脚本每20秒运行一次。

    1 回复  |  直到 6 年前
        1
  •  2
  •   aschipfl    7 年前

    在Windows命令提示符中,无法处理介于-2之间的有符号32位整数范围之外的数字 31 =-2147483648到2 31 - 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
    

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

    我还更改了 for /F 捕捉 wmic 输出以避免Unicode转换伪影,如孤立的回车(CR)字符,这将导致变量 FreeSpace 包含一个数字加上一个CR。这就是为什么我还要查询这个值 Size 虽然不需要,但是 自由空间 值不是最后一个可能由CR尾随的值。

    顺便说一句,请注意,我从 if 命令行。