标题: [数值计算] 用 powershell 为 cmd 把数字转换为易读形式 [打印本页]
作者: newswan 时间: 2024-8-28 01:33 标题: 用 powershell 为 cmd 把数字转换为易读形式
_n_ 数值
_nf_ 转换后带单位的数值,数值部分为 0.0 00 000 0000 格式,单位 B K M G T- call :C_SizeReadable %_n_% _nf_
- echo %_nf_%
-
- pause
- exit/b
-
- :C_SizeReadable
- set _pw_=$num = %1
- set _pw_=%_pw_% ; $unit =@('B','K','M','G','T')
- set _pw_=%_pw_% ; $i = 0 ; while ( ( $num -gt 1024 ) -and ( $i -lt ( $unit.Length - 1 ) ) ) { $i++ ; $num = $num / 1024 }
- set _pw_=%_pw_% ; '{0} {1}' -f $( if ( $num -lt 10 ) { '{0:0.0}' -f $num } else { '{0:0}' -f $num } ) , $unit[$i]
- for /f "usebackq tokens=* delims=" %%a in (` powershell -command "& { %_pw_% }" `) do ( set %2=%%a )
- set _pw_=
- goto :eof
复制代码
作者: aloha20200628 时间: 2024-8-28 12:08
本帖最后由 aloha20200628 于 2024-8-28 12:55 编辑
以下代码存为 test.bat 运行,每次输入一个字节值(直接回车键退出),输出结果为相应的换算单位值 B/K/M/G/T(保留小数点2位),上限=909T
- @echo off &setlocal
- :loop
- set "n=" &set/p "n=输入一个字节值:"
- if not defined n endlocal&exit/b
- for /f "delims=" %%v in (
- '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" '
- ) do echo,%%v
- goto :loop
复制代码
作者: aloha20200628 时间: 2024-8-28 13:22
本帖最后由 aloha20200628 于 2024-8-28 13:23 编辑
再给一个向资源管理器中 ‘文件尺寸显示格式’ 看齐的版本...
- @echo off &setlocal
- :loop
- set "n=" &set/p "n=字节值:"
- if not defined n endlocal&exit/b
- for /f "delims=" %%v in (
- '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}" '
- ) do echo,%%v
- goto :loop
复制代码
作者: Five66 时间: 2024-8-29 00:17
这样子么- call :C_SizeReadable %_n_% _nf_
- echo %_nf_%
-
- pause
- exit/b
-
- :C_SizeReadable
- 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]"
- for /f "usebackq tokens=* delims=" %%a in (` powershell -command "& { %_pw_% }" `) do ( set %2=%%a )
- goto :eof
复制代码
作者: aloha20200628 时间: 2024-8-29 11:17
本帖最后由 aloha20200628 于 2024-8-29 11:20 编辑
2楼代码用于反复测试不同大小的字节值转换结果,若用于嵌入批处脚本中的某段代码,可将2楼代码简化如下(转换结果向资源管理器显示格式看齐):- @echo off &set/p "n=字节值:"
- for /f "delims=" %%v in (
- '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}" '
- ) do echo,%%v
复制代码
备注》其中设置转换量级上限为TB级一般已足够实用;关于转换格式要向资源管理器显示格式看齐,未发现用 powershell(<v5.0)的格式化表达式直接实现的捷径;用三元表达式进一步简化代码的余地须有 powershell v7.0+ 支持...
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |