Board logo

标题: [数值计算] 用 powershell 为 cmd 把数字转换为易读形式 [打印本页]

作者: newswan    时间: 2024-8-28 01:33     标题: 用 powershell 为 cmd 把数字转换为易读形式

_n_  数值
_nf_ 转换后带单位的数值,数值部分为 0.0 00 000 0000 格式,单位 B K M G T
  1. call :C_SizeReadable %_n_% _nf_
  2. echo %_nf_%
  3. pause
  4. exit/b
  5. :C_SizeReadable
  6. set _pw_=$num = %1
  7. set _pw_=%_pw_% ; $unit =@('B','K','M','G','T')
  8. set _pw_=%_pw_% ; $i = 0 ; while ( ( $num -gt 1024 ) -and ( $i -lt ( $unit.Length - 1 ) ) ) { $i++ ; $num = $num / 1024 }
  9. set _pw_=%_pw_% ; '{0} {1}' -f $( if ( $num -lt 10 ) { '{0:0.0}' -f $num } else { '{0:0}' -f $num } ) , $unit[$i]
  10. for /f "usebackq tokens=* delims=" %%a in (` powershell -command "& { %_pw_% }" `) do ( set %2=%%a )
  11. set _pw_=
  12. goto :eof
复制代码

作者: aloha20200628    时间: 2024-8-28 12:08

本帖最后由 aloha20200628 于 2024-8-28 12:55 编辑


以下代码存为 test.bat 运行,每次输入一个字节值(直接回车键退出),输出结果为相应的换算单位值 B/K/M/G/T(保留小数点2位),上限=909T
  1. @echo off &setlocal
  2. :loop
  3. set "n=" &set/p "n=输入一个字节值:"
  4. if not defined n endlocal&exit/b
  5. for /f "delims=" %%v in (
  6. 'powershell "$z=%n%;foreach($u in ('B','K','M','G','T')){if($z -lt 1kb){$uz=$u;break}else{$z/=1kb}};''+[math]::round($z,2)+$uz" '
  7. ) do echo,%%v
  8. goto :loop
复制代码

作者: aloha20200628    时间: 2024-8-28 13:22

本帖最后由 aloha20200628 于 2024-8-28 13:23 编辑


再给一个向资源管理器中 ‘文件尺寸显示格式’ 看齐的版本...
  1. @echo off &setlocal
  2. :loop
  3. set "n=" &set/p "n=字节值:"
  4. if not defined n endlocal&exit/b
  5. for /f "delims=" %%v in (
  6. 'powershell "$z=%n%;foreach($u in ('B','K','M','G','T')){if($z -lt 1kb){$uz=$u;break}else{$z/=1kb}};$z=(''+$z).substring(0,4);if($z[-1] -eq '.'){$z.substring(0,3)+$uz}else{$z+$uz}" '
  7. ) do echo,%%v
  8. goto :loop
复制代码

作者: Five66    时间: 2024-8-29 00:17

这样子么
  1. call :C_SizeReadable %_n_% _nf_
  2. echo %_nf_%
  3. pause
  4. exit/b
  5. :C_SizeReadable
  6. set "_pw_=$f=(' B',' K',' M',' G',' T',' P',' E');$s=%_n_%;$i=0;if($s -lt 1024){}else{while($s -ge 1024){$s/=1024;$i+=1}};$s.tostring('F2')+$f[$i]"
  7. for /f "usebackq tokens=* delims=" %%a in (` powershell -command "& { %_pw_% }" `) do ( set %2=%%a )
  8. goto :eof
复制代码

作者: aloha20200628    时间: 2024-8-29 11:17

本帖最后由 aloha20200628 于 2024-8-29 11:20 编辑


2楼代码用于反复测试不同大小的字节值转换结果,若用于嵌入批处脚本中的某段代码,可将2楼代码简化如下(转换结果向资源管理器显示格式看齐):
  1. @echo off &set/p "n=字节值:"
  2. for /f "delims=" %%v in (
  3.    'powershell "$z=%n%;foreach($u in ('B','K','M','G','T')){if($z -lt 1kb){$uz=$u;break}else{$z/=1kb}};$z=(''+$z).substring(0,4);if($z[-1] -eq '.'){$z.substring(0,3)+$uz}else{$z+$uz}" '
  4. ) do echo,%%v
复制代码
备注》其中设置转换量级上限为TB级一般已足够实用;关于转换格式要向资源管理器显示格式看齐,未发现用 powershell(<v5.0)的格式化表达式直接实现的捷径;用三元表达式进一步简化代码的余地须有 powershell v7.0+ 支持...





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