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

[数值计算] 【已解决】为什么if比较两个大数字的大小会出现误判/判断错误/有误?

本帖最后由 pcl_test 于 2017-4-10 13:55 编辑

麻烦帮忙看下下面的输出结果及命令,我有点迷胡了。有人可以解释一下为什么会有if 2822439936 GEQ 20222222222 echo yes
yes这个么?明显的没有后面的数值大啊。
  1. C:\>for /f "delims=" %a in ('dir /a/s/b d:\*.pst') do if %~za geq 20222222222 ec
  2. ho yes
  3. C:\>if 79250432 GEQ 20222222222 echo yes
  4. C:\>if 271360 GEQ 20222222222 echo yes
  5. C:\>if 38618112 GEQ 20222222222 echo yes
  6. C:\>if 514778112 GEQ 20222222222 echo yes
  7. C:\>if 20220691456 GEQ 20222222222 echo yes
  8. yes
  9. C:\>if 2822439936 GEQ 20222222222 echo yes
  10. yes
  11. C:\>if 146293760 GEQ 20222222222 echo yes
  12. C:\>if 271360 GEQ 20222222222 echo yes
  13. C:\>if 271360 GEQ 20222222222 echo yes
  14. C:\>if 95503360 GEQ 20222222222 echo yes
  15. C:\>
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 happy886rr 于 2016-3-25 18:07 编辑

回复 1# kingshui
超过了就会溢出。也就是超过21亿多后就无法使用大小比较的语法了。你后边的数都200多亿了,早爆了。

TOP

参数不能转换为 long int 类型时(-2147438648~+2141438647),就进行字符串比较

2822439936 GEQ 20222222222
实际上是先比较 2 和 2,再比较 8 和 0

TOP

多谢两位,基础差了,回头再试下,用g来计算比较试下。

TOP

用powershell或者python之类的高级语言处理,过程会简单很多.
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

  1. hash /z::20222222222 /a /s
复制代码

TOP

本帖最后由 pcl_test 于 2017-1-23 12:52 编辑

补0使两个数字位数相同再比较
if 02822439936 GEQ 20222222222 (echo;yes) else echo;No


cmd窗口下运行,以批处理文件运行需将%替换成%%
  1. @(for /f "delims=" %a in ('dir /a-d/s/b d:\*.pst') do @echo;%a*%~za)|mshta "javascript:with(new ActiveXObject('Scripting.FileSystemObject')){var files=GetStandardStream(0).readall().split('\r\n');for(var i=0;i<files.length;i++){var f=files[i].split('*');if(f[1]>=20222222222)GetStandardStream(1).WriteLine(f.join('|')+'|YES')}}close()"|find /v ""
  2. @pause
复制代码

TOP

回复 7# pcl_test

多谢,直接用了。

TOP

cmd
pcl_test 发表于 2016-3-25 23:02



  本来调用外部命令还要写像2层for不理解.效率实在不堪入目

TOP

回复 9# Nsqs


    他只调用了三次外部命令

TOP

回复 10# CrLf

    dir枚举文件算一次循环,调用js每次都需要启动mshta又用readall读文本是不对的.readall本身读取文件就需要耗费资源.在读取百万级大文本甚是需要几分钟到几十分钟不等.
加上for与split正则计算最后more,不算大文本就单纯重量级数量,效率实在堪忧

TOP

回复 11# Nsqs

mshta语句只对for语句输出的%a*%~za(文件*大小)进行处理,readall并不读取文本,效率只取决于dir的遍历查找和文件的数量

TOP

test.bat
  1. @echo off
  2. powershell -c "Get-ChildItem -Recurse -Path 'D:\' *.pst | %{if($_.Length -ge 20222222222){$_.Name + " " + $_.Length}}"
  3. pause
复制代码

TOP

返回列表