请选择 进入手机版 | 继续访问电脑版

 找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 2476|回复: 6

[数值计算] 计算机单位换算脚本.BAT

[复制链接]
发表于 2026-10-2 07:36:21 | 显示全部楼层 |阅读模式

--------------------------------计算机单位换算脚本.BAT-----------扔代码-------
  1. @Echo off
  2. Rem;;;;;;下句 +1 是为了防止 %b% = 0
  3. Set/a b=%Random% %% 9 + 1
  4. :Run
  5. Set/a a+=1
  6. Set s=%s%%Random%
  7. If Not %a% equ %b% Goto,Run
  8. Rem;;;;;; 下句 %s% 是转换值,可以用其他变量或数值取代,上面几句是编写临时测试脚本用的,可以扔了。。
  9. Echo.i="%s%" >$
  10. Echo.If i^<1024 Then  >>$
  11. Echo.l=i^&" Byte" >>$
  12. Echo.ElseIf i^<1048576 Then l=Round(i/1024,2)^&" KB" >>$
  13. Echo.ElseIf i^<1073741824 Then l=Round(i/1048576,2)^&" MB" >>$
  14. Echo.Elseif i^<1099511627776 Then l=Round(i/1073741824,2)^&" GB" >>$
  15. Echo.Elseif i^<1125899906842624 Then l=Round(i/1099511627776,2)^&" TB" >>$
  16. Echo.Elseif i^<1152921504606846976 Then l=Round(i/1125899906842624,2)^&" PB" >>$
  17. Echo.Elseif i^<1180591620717411303424 Then l=Round(i/1152921504606846976,2)^&" EB" >>$
  18. Echo.Elseif i^<1208925819614629174706176 Then l=Round(i/1180591620717411303424,2)^&" ZB" >>$
  19. Echo.Elseif i^<1237940039285380274899124224 Then l=Round(i/1208925819614629174706176,2)^&" YB" >>$
  20. Echo.Elseif i^<1267650600228229401496703205376 Then l=Round(i/1237940039285380274899124224,2)^&" BB" >>$
  21. Echo.Elseif i^<1298074214633706907132624082305024 Then l=Round(i/1267650600228229401496703205376,2)^&" NB" >>$
  22. Echo.Elseif i^<1329227995784915872903807060280344576 Then l=Round(i/1298074214633706907132624082305024,2)^&" DB" >>$
  23. Echo.Elseif i^<1361129467683753853853498429727072845824 Then l=Round(i/1329227995784915872903807060280344576,2)^&" CB" >>$
  24. Echo.Else l=Round(i/1361129467683753853853498429727072845824,2)^&" XB" >>$
  25. Echo.End If >>$
  26. Echo.Wscript.Echo l >>$
  27. Rem;;;;;;如果单纯的求换算可以把以下生成的代码删了,保留自删那行就可以了
  28. Echo.BE=i^&" Byte" >>$
  29. Echo.KB=Round(i/1024,2)^&" KB" >>$
  30. Echo.MB=Round(i/1048576,2)^&" MB" >>$
  31. Echo.GB=Round(i/1073741824,2)^&" GB" >>$
  32. Echo.TB=Round(i/1099511627776,2)^&" TB" >>$
  33. Echo.PB=Round(i/1125899906842624,2)^&" PB" >>$
  34. Echo.EB=Round(i/1152921504606846976,2)^&" EB" >>$
  35. Echo.ZB=Round(i/1180591620717411303424,2)^&" ZB" >>$
  36. Echo.YB=Round(i/1208925819614629174706176,2)^&" YB" >>$
  37. Echo.BB=Round(i/1237940039285380274899124224,2)^&" BB" >>$
  38. Echo.NB=Round(i/1267650600228229401496703205376,2)^&" NB" >>$
  39. Echo.DB=Round(i/1298074214633706907132624082305024,2)^&" DB" >>$
  40. Echo.CB=Round(i/1329227995784915872903807060280344576,2)^&" CB" >>$
  41. Echo.XB=Round(i/1361129467683753853853498429727072845824,2)^&" XB" >>$
  42. Echo.Wscript.Echo "=====================" ^& chr(10) ^& l ^& chr(10) ^& "---------------------" ^& chr(10) ^& BE ^& chr(10) ^& KB ^& chr(10) ^& MB ^& chr(10) ^& GB ^& chr(10) ^& TB ^& chr(10) ^& PB ^& chr(10) ^& EB ^& chr(10) ^& ZB ^& chr(10) ^& YB ^& chr(10) ^& BB ^& chr(10) ^& NB ^& chr(10) ^& DB ^& chr(10) ^& CB ^& chr(10) ^& XB ^&  chr(10) ^& "=====================" >>$
  43. Rem;;;;;;下句是VBS 自删语句,不建议删除
  44. Echo.CreateObject("Scripting.Filesystemobject").DeleteFile(Wscript.ScriptFullName)>>$
  45. Rem;;;;;;下句是脚本该脚本调用显示,完整获取 可以用 FOR Cscript -e:vbs -nologo $ 获取转换值和单位,,
  46. Start/Max "随机生成计算机单位" Cmd /t:e0 /k Echo.随机数【%s%】,循环 %b% 次!^& Cscript -e:vbs -nologo $ ^& Pause^>Nul ^& Exit & Exit
复制代码

------------------------------存ANSI 编码---------名 XXXXXX.BAT  -------

朋友写脚本问我,怎么把获取到的文件大小 Size 准确的换成合适的单位来表达,保留小数点后两位
原本我是叫他去找A1的,不过那家伙功底好像有点低,而且比我还懒,,
帮他找里几个A1答复,感觉不是很满意,,
那叼毛,想找的就是全单位转换,Byte,KB、MB、GB、TB、PB、EB、ZB、YB、BB、NB、DB、CB,XB
BAT 下不可转换,可以借助 VBS 来转换,,于是编写了该脚本,,,
编写的时候,计算的位数高达 40 位,1361129467683753853853498429727072845824

普通市面上的计算器 根本无法精确计算,,

找了很多计算器,要么不支持,要么挂羊头卖狗肉,,要么要登录下载,要么过期,
找了几款在线 大整数计算器 ,广告还特别的多,,

于是于昨天,一气之下 , 抽取了其中一款在线计算器的部分核心计算源码,,
借助 A1 改写了一款  “大整数计算器 — 超大整数运算与进制转换”,的计算器,
https://www.bathome.net/thread-95286-1-1.html
支持 10万位整数计算表达,,,算是意外所得,,
,人啊,不能吃太饱,闲得慌!,,,
发表于 2026-10-2 21:33:23 | 显示全部楼层
让AI参考 https://bbs.bathome.net/forum.ph ... 1593&pid=153139

逐位长除法

bytes_convert.bat

  1. @echo off
  2. setlocal EnableExtensions EnableDelayedExpansion

  3. :input
  4. set "bytes="
  5. set /p "bytes=Bytes: "
  6. if not defined bytes exit /b

  7. rem 检查输入是否全部为数字
  8. set "bad=!bytes!"
  9. for %%D in (0 1 2 3 4 5 6 7 8 9) do if defined bad set "bad=!bad:%%D=!"
  10. if defined bad (
  11.     echo Please enter a nonnegative integer using digits only.
  12.     goto input
  13. )
  14. if not "!bytes:~1000,1!"=="" (
  15.     echo Please enter at most 1000 digits.
  16.     goto input
  17. )

  18. rem 去除多余的前导零
  19. :trim_input
  20. if "!bytes:~0,1!"=="0" if not "!bytes:~1!"=="" (
  21.     set "bytes=!bytes:~1!"
  22.     goto trim_input
  23. )

  24. rem 末尾补三个零,相当于乘以1000,内部保留三位小数
  25. set "scaled=!bytes!000"
  26. set "best=!bytes! Byte"
  27. echo(
  28. echo !bytes! Byte

  29. for %%U in (KB MB GB TB PB EB ZB YB BB NB DB CB XB) do (
  30.     call :divide1024
  31.     call :format2
  32.     echo !shown! %%U
  33.     rem scaled至少有四位,说明换算结果不小于1
  34.     if not "!scaled:~3,1!"=="" set "best=!shown! %%U"
  35. )

  36. echo(
  37. echo Auto: !best!
  38. echo(
  39. pause
  40. exit /b

  41. rem 大整数除以1024,商仍然保存为字符串
  42. :divide1024
  43. setlocal EnableDelayedExpansion
  44. set "src=!scaled!"
  45. set "quotient="
  46. set /a rem=0

  47. :divide_next
  48. set /a "work=rem*10+!src:~0,1!,digit=work/1024,rem=work%%1024"
  49. if defined quotient (
  50.     set "quotient=!quotient!!digit!"
  51. ) else if !digit! neq 0 (
  52.     set "quotient=!digit!"
  53. )
  54. set "src=!src:~1!"
  55. if defined src goto divide_next

  56. if not defined quotient set "quotient=0"
  57. endlocal & set "scaled=%quotient%"
  58. exit /b

  59. rem 四舍五入到两位小数,不修改内部的scaled
  60. :format2
  61. setlocal EnableDelayedExpansion
  62. set "digits=000!scaled!"
  63. set "round=!digits:~-1!"
  64. set "digits=!digits:~0,-1!"
  65. if !round! lss 5 goto format_trim

  66. rem 对任意长度的数字字符串加1,处理连续进位
  67. set "tail="

  68. :format_carry
  69. set "digit=!digits:~-1!"
  70. set "digits=!digits:~0,-1!"
  71. if "!digit!"=="9" (
  72.     set "tail=0!tail!"
  73.     goto format_carry
  74. )
  75. set /a digit+=1
  76. set "digits=!digits!!digit!!tail!"

  77. :format_trim
  78. if "!digits:~0,1!"=="0" if not "!digits:~3!"=="" (
  79.     set "digits=!digits:~1!"
  80.     goto format_trim
  81. )
  82. set "shown=!digits:~0,-2!.!digits:~-2!"
  83. endlocal & set "shown=%shown%"
  84. exit /b
复制代码

评分

参与人数 1技术 +1 收起 理由
flashercs + 1 感谢分享,利用长除法解决任意长度的数值除 ...

查看全部评分

发表于 2026-10-5 17:33:17 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-10-5 21:31 编辑

用 bat+powershell 简化此题的解法如下,虽然目前存储设备厂商单个最大容量产品仍在 TB 量级,代码中还是扩展至 XB 量级作为示例,超过 XB 量级的转换结果均以 XB 为单位。

test.bat
  1. @echo off &setlocal &set "u=B KB MB GB TB PB EB ZB YB BB NB DB CB XB"
  2. :loop
  3.   set "v=" &set/p "v=输入一个字节值,须为正整数(直接回车键退出):"
  4.   if not defined v exit/b
  5.   for /f "delims=1234567890" %%i in ("%v:"=%") do goto :loop
  6.   powershell -nop -c "$n,$v,$u=0,%v%,'%u%'.split(); while($v/1kb -ge 1){$v/=1kb;if(++$n -eq $u.length-1){break}};(('{0:n2}' -f $v) -replace '\.*0+$')+' '+$u[$n]"
  7.   goto :loop
复制代码

评分

参与人数 1技术 +1 收起 理由
flashercs + 1 乐于助人;double类型精度不够,如输入长度为 ...

查看全部评分

发表于 2026-10-5 21:14:16 | 显示全部楼层
77七 发表于 2026-10-2 21:33
让AI参考 https://bbs.bathome.net/forum.php?mod=redirect&goto=findpost&ptid=31593&pid=153139

逐位长 ...

长除法用的真好,解决了任意长度的整数的除法问题;
这是AI写的代码吗?哪个AI写的?
发表于 2026-10-5 21:16:24 | 显示全部楼层
本帖最后由 flashercs 于 2026-10-5 21:54 编辑
aloha20200628 发表于 2026-10-5 17:33
用 bat+powershell 简化此题的解法如下,虽然目前存储设备厂商单个最大容量产品仍在 TB 量级,代码中还是扩 ...


double类型的精度不够, 如果输入长度500的大整数,会出错的;应该用 System.Numerics.BigInteger
  1. $n,$v,$u=0,[bigint]'%v%','%u%'.split();
复制代码
发表于 2026-10-5 22:16:50 | 显示全部楼层
本帖最后由 aloha20200628 于 2026-10-6 11:30 编辑
flashercs 发表于 2026-10-5 21:16
double类型的精度不够, 如果输入长度500的大整数,会出错的;


   给出的示例脚本仅为实用,即与本帖主题有关的 '字节量转 KB,MB,GB,... 单位' 的实用性(采用5位有效数字 aaa.bb 的浮点数格式),可能更多是用于获取 MB~TB 区段且保留两位小数精度的转换结果
   刚刚用 ai 查获 idc 报告2025年的全球年度数据生成量,也只是 ZB 量级(数据长度不过30位),而被物理存储的数据量,更是其中很小一部分...
 楼主| 发表于 2026-10-5 23:01:31 | 显示全部楼层
你们有毅力,,,
我都是直接硬桥硬码的硬推,,
钓鱼时候(空军),爪机临时查资料,拼出来的,,
回来之后随便校对一下代码可行性,就硬推了,,,,
我以为我自己已经够懒了,,结果,我那叼毛朋友比我还懒,,,
这几天没口,,呆着,就又用A1 随便写了个 HTA 小说阅读工具,,,
QQ拼音截图20261005225829.png
功能和其他设置都有,还能保存设置,阅读记录,书签等等,才100K 不到,,够用了,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-10-16 13:39

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表