Board logo

标题: [数值计算] 请教批处理数字分割功能(已解决) [打印本页]

作者: a138534    时间: 2020-11-23 14:26     标题: 请教批处理数字分割功能(已解决)

本帖最后由 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:31

本帖最后由 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变量的末尾,所以你用我给你的代码获取就可以正确截取理想长度了
作者: a138534    时间: 2020-11-23 16:13

回复 2# flashercs


    太牛了大神
作者: ivor    时间: 2020-11-23 18:58

本帖最后由 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)"
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2