[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 请教批处理数字分割功能(已解决)

本帖最后由 a138534 于 2020-11-23 16:14 编辑

我在编写一个判断磁盘空间的脚本,当取出的值过大时就会判断出错,经过论坛搜索发现bat脚本不支持大于32位的数字,于是改为了将倒数第0位到倒数第9位去除的方法,不过还是有问题:假如磁盘空间是87705575424 取9位的话得出8770 取11位的话才是87
  1. for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Caption='D:'" get freespace /value') do set space=%%i
  2. set space=%space:~0,-9%
  3. echo %space%
复制代码
请教高手们如何解决这个问题呢

本帖最后由 flashercs 于 2020-11-23 15:36 编辑

批处理仅支持int32整数,但你可以用字符串来替代数值类型进行比较,uint64最大值才20位整数,你可以设定32位字符串代表整数,远远超过uint64最大值。例子:
  1. @echo off
  2. REM  32位10进制整数
  3. set prefix=00000000000000000000000000000000
  4. for /f "tokens=*" %%i in ('wmic logicaldisk where "Caption='D:'" get freespace /value^|find "="') do set %%i
  5. set freespace=%prefix%%freespace%
  6. set freespace=%freespace:~-32%
  7. echo %freespace%
  8. REM 比较对象64GB
  9. set targetSpace=64000000000
  10. set targetSpace=%prefix%%targetSpace%
  11. set targetSpace=%targetSpace:~-32%
  12. REM 比较大小
  13. if "%freespace%" gtr "%targetSpace%" (
  14.   echo 大于64GB
  15. ) else (
  16.   echo 小于等于64GB
  17. )
  18. pause
  19. exit /b
复制代码
你截取错误原因是这行代码有bug
  1. for /f "tokens=2 delims==" %%i in ('wmic logicaldisk where "Caption='D:'" get freespace /value') do set space=%%i
复制代码
wmic返回的字符串后面有个\r字符,是看不见的,但是它确实在space变量的末尾,所以你用我给你的代码获取就可以正确截取理想长度了
微信:flashercs
QQ:49908356

TOP

回复 2# flashercs


    太牛了大神

TOP

本帖最后由 ivor 于 2020-11-23 19:05 编辑
  1. powershell "'{0:N2}GB' -f ((Get-CimInstance -Query 'select * from win32_logicaldisk where name like ''d:''').FreeSpace/1gb)"
复制代码
  1. powershell "'{0:N2}GB' -f ((Get-WmiObject -Class win32_logicaldisk -Filter 'deviceid like ''d:''').FreeSpace/1gb)"
复制代码
#&cls&@powershell "Invoke-Expression ([Io.File]::ReadAllText('%~0',[Text.Encoding]::UTF8))" &pause&exit

TOP

返回列表