Board logo

标题: [数值计算] [已解决]批处理怎样把文件大小如1K、2M转换成字节? [打印本页]

作者: ttenma    时间: 2011-2-14 00:45     标题: [已解决]批处理怎样把文件大小如1K、2M转换成字节?

程序需要输入字节,每次都要在计算器里算一次。希望有个方便点的方法。

例如输入 1K 自动转成 1024
输入 2M 自动转成 2097152

我能想到的方法是,如果全是数字,不改变。
最后一个字母是K,数字部分就乘以1024。
最后一个字母是M,数字部分乘1048576
最后一个字母是G,数字部分乘1073741824
不算T,输入数字为整数,有没有简单的方法?

SET /P size=
......
echo %size%

[ 本帖最后由 ttenma 于 2011-2-14 20:55 编辑 ]
作者: ubcc    时间: 2011-2-14 00:59

我不会写,不好意思啊
作者: broly    时间: 2011-2-14 01:04

批处理如果计算大数字,容易超过范围。
下面这个是VBS,支持TB计算:
  1. On Error Resume Next
  2. Dim strInput,strOutput,sngNum,strRes,strLast
  3. Do
  4.   strInput=InputBox("请输入:")
  5.   strLast=Right(Trim(strInput),1)
  6.   sngNum=Left(Trim(strInput),Len(strInput)-1)
  7.   Select Case LCase(strLast)
  8.     Case "k"
  9.       strOutput=sngNum*1024
  10.     Case "m"
  11.       strOutput=sngNum*1024*1024
  12.     Case "g"
  13.       strOutput=sngNum*1024*1024*1024
  14.     Case "t"
  15.       strOutput=sngNum*1024*1024*1024*1024
  16.   End Select
  17.   strRes=MsgBox("结果为: "&strOutput&" 字节"&vbCrLf &_
  18.     vbCrLf & "继续?",vbYesNo+vbInformation,"提示")
  19. Loop Until strRes=vbNo
复制代码

[ 本帖最后由 broly 于 2011-2-14 01:08 编辑 ]
作者: CrLf    时间: 2011-2-14 01:15

变量替换就行了,只是只支持20MB以下:
  1. @echo off
  2. set size=1024M
  3. set K=%size:M=*1024K%
  4. set /a B=%K:K=*1024%
  5. echo %B%
  6. pause
复制代码

笔误已修正

[ 本帖最后由 zm900612 于 2011-2-14 01:53 编辑 ]
作者: CrLf    时间: 2011-2-14 01:28

或者这样,计算范围会大很多,最大支持909T的简单计算(不支持5T100G2M1K这种输入):
  1. @echo off
  2. set size=909T
  3. set G=%size:T=*1024G%
  4. set M=%G:G=*1024M%
  5. set K=%M:M=*1024K%
  6. set B=%K:K=*1024%
  7. mshta vbscript:msgbox("%size%="^&eval("%B%")^&"字节")(window.close)
  8. pause
复制代码

作者: CrLf    时间: 2011-2-14 01:47

非要输出在cmd里以便复制也可以(话说复制到剪贴板不是更方便):
  1. @echo off
  2. set size=909T
  3. set G=%size:T=*1024G%
  4. set M=%G:G=*1024M%
  5. set K=%M:M=*1024K%
  6. set B=%K:K=*1024%
  7. %1 mshta vbscript:createobject("wscript.shell").run("%~s0 ::"^&"%size%="^&eval("%B%")^&"字节")(window.close)&&exit
  8. echo;%2
  9. pause
复制代码

作者: ttenma    时间: 2011-2-14 01:49

主要還是批量處理,程序能直接使用。例如 xxxx.exe -b %size%
上限为50G=53687091200
作者: wc726842270    时间: 2011-2-14 01:51     标题: 回复 4楼 的帖子

思路不错,不过有个小失误。
  1. set K=%size:M=*1024K%
  2. set /a B=%size:K=*1024%
复制代码

作者: CrLf    时间: 2011-2-14 01:52

那也好办...
  1. @echo off
  2. set size=909T
  3. set G=%size:T=*1024G%
  4. set M=%G:G=*1024M%
  5. set K=%M:M=*1024K%
  6. set B=%K:K=*1024%
  7. mshta vbscript:createobject("wscript.shell").run("xxxx.exe -b "^&"%size%="^&eval("%B%")^&"字节")(window.close)
复制代码

作者: wc726842270    时间: 2011-2-14 01:54     标题: 回复 7楼 的帖子

个人感觉。VBS更加实用
作者: CrLf    时间: 2011-2-14 02:05

同感,计算的事情实在不是bat长项
作者: broly    时间: 2011-2-14 12:08

要批量?
  1. '//保存我为1.vbs
  2. On Error Resume Next
  3. Dim objArgs,strInput,strOutput,sngNum,strRes,strLast
  4. Set objArgs=WScript.Arguments
  5. If objArgs.Count=0 Then WScript.Quit
  6.   strInput=objArgs.Item(0)
  7.   strLast=Right(Trim(strInput),1)
  8.   sngNum=Left(Trim(strInput),Len(strInput)-1)
  9.   Select Case LCase(strLast)
  10.     Case "k"
  11.       strOutput=sngNum*1024
  12.     Case "m"
  13.       strOutput=sngNum*1024*1024
  14.     Case "g"
  15.       strOutput=sngNum*1024*1024*1024
  16.     Case "t"
  17.       strOutput=sngNum*1024*1024*1024*1024
  18.   End Select
  19. WScript.Echo strInput&" = "&strOutput&" 字节"
复制代码


用法:
  1. cscript /nologo 1.vbs 一个参数如1M
复制代码


批量事例:
  1. @echo off
  2. for /f "delims=" %%i in ('more +7 "%~f0"') do (
  3.   cscript /nologo 1.vbs %%i
  4. )
  5. pause&exit
  6. 1m
  7. 4k
  8. 76g
  9. 456k
  10. 8567m
  11. 45g
复制代码

作者: hanyeguxing    时间: 2011-2-14 12:20

  1. @echo off
  2. call:s 1234t
  3. echo %size%
  4. pause&exit
  5. :s
  6. setlocal enableDelayedExpansion
  7. set p=%1&set q=%1&set p1=!p:~0,-1!&set p2=!p:~-1!
  8. if /i %p2%==k set/a q=p1*1024
  9. if /i %p2%==m set/a q=p1*1048576
  10. if /i %p2%==g set n=1073741824&call:e
  11. if /i %p2%==t set n=1099511627776&call:e
  12. endlocal&set size=%q%&goto:eof
  13. :e
  14. set q=&set/a q1=p1*%n:~0,-6%,q2=p1*%n:~-6%
  15. set q1=0000000000%q1%000000&set q1=!q1:~-16!
  16. set q2=0000000000%q2%&set q2=!q2:~-16!
  17. for /l %%a in (-1,-1,-16) do (
  18.         set/a n=!q1:~%%a,1!+!q2:~%%a,1!+m,m=0&set q=!n:~-1!!q!
  19.         if !n! geq 10 set m=1
  20. )
  21. for /l %%a in (1,1,10) do if !q:~0^,1!==0 (set q=!q:~1!) else goto:eof
复制代码

[ 本帖最后由 hanyeguxing 于 2011-2-14 12:36 编辑 ]
作者: ttenma    时间: 2011-2-14 20:54

13楼的能正常使用。
但有个小问题,上限是50G,输入51200M,52428800K时会出错。
影响不大,算是解决了。
作者: hanyeguxing    时间: 2011-2-14 21:05     标题: 回复 14楼 的帖子

51200M应该写成51G,否则51G存在还有什么意义了呢?




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