批量脚本中实现USB/SD外设容量格式化显示的问题求助
批量脚本中实现USB/SD外设容量格式化显示的问题求助
嗨,作为批处理新手遇到这种变量处理的问题太正常了,我来帮你分析并解决这个问题~
问题根源
你原来的思路是把所有设备的容量都拼接成一个用空格分隔的字符串存在$size变量里,之后再用!$size:~0,-9!截断。但这个操作是对整个字符串生效的,而不是逐个处理每个设备的容量值——比如如果有两个设备容量分别是1073741824(1GB)和2147483648(2GB),拼接后的$size是 1073741824 2147483648,截断后会变成 1073741824 2,完全不符合预期。
正确的做法应该是在循环内部逐个处理每个设备的容量,而不是先把所有值攒起来再统一处理。
修改后的完整代码
@echo off setlocal enabledelayedexpansion :chkUSB echo. echo 已连接的USB/SD设备信息: echo -------------------------- for /f "skip=2 tokens=2-4 delims=," %%a in ('wmic logicaldisk where drivetype^=2 get deviceid^,Size^,VolumeName^ /format:csv') do ( rem 处理当前设备的容量:从字节转换为GB(截断最后9位) set "current_size=%%b" if not "!current_size!"=="" ( rem 截断最后9位得到近似GB值,你也可以根据需求调整截断位数: rem 截断最后6位=MB,最后3位=KB set "formatted_size=!current_size:~0,-9! GB" ) else ( rem 处理容量为空的情况(比如未格式化的SD卡) set "formatted_size=未知" ) rem 逐个输出当前设备的信息 echo 盘符:%%a echo 名称:%%c echo 容量:!formatted_size! echo -------------------------- ) pause exit /b
关键修改点说明
- 循环内单独处理每个设备:不再把所有盘符、名称、容量拼接成大字符串,而是在循环里直接处理单个设备的所有信息,避免了多设备时的对应关系错位问题(比如某个设备没有卷名,原来的拼接方法会让后续的名称和容量对应错误)
- 容量格式化逻辑独立:针对每个设备的
Size值单独做截断处理,确保每个容量值都能正确转换为GB单位 - 增加异常处理:判断
Size是否为空,避免未格式化的设备输出奇怪的内容
补充小提示
- 如果需要转换为MB,把
!current_size:~0,-9!改成!current_size:~0,-6!即可 - 如果需要更精确的容量计算(比如考虑1GB=1024^3字节),批处理实现会复杂一些,不过对于测试用途来说,截断的方式已经足够啦
备注:内容来源于stack exchange,提问作者calade
相关产品推荐
相关产品推荐

