如何设置WMIC for循环Flashdrive以获得型号,文件系统和大小以GB为单位?

问题描述

下面提到的批处理文件显示了闪存驱动器的型号,文件系统和PC的大小

@echo off
setlocal
for /f "usebackq skip=1" %%X in (`
    wmic logicaldisk where "drivetype='2'" 2^>nul get caption
  `) do call :driveusb %%X
pause

::-----------------------------------------
:driveusb
if "%~1"=="" goto :eof
set "freeB=" & set "sizeB="
set "filesys="
set "flashmodel="

for /f "usebackq skip=1 tokens=1,2" %%x in (`
    wmic logicaldisk where "name='%1'" get filesystem
  `) do if not defined filesys set filesys=%%x

for /f "usebackq skip=1 tokens=1-6" %%a in (`
    wmic diskdrive where "mediatype='removable media'" get model
  `) do if not defined flashmodel set flashmodel=%%a %%b %%c %%d %%e %%f

for /f "usebackq skip=1 tokens=1,2" %%X in (`
    wmic logicaldisk where "name='%1'" get freespace^,size
  `) do if not defined freeB (set "freeB=%%X" & set "sizeB=%%Y")

set/a freeMB = %freeB:~0,-6% & set/a sizeMB = %sizeB:~0,-6%
set/a freePCT = (100 * freeMB + sizeMB / 2) / sizeMB
call :mb2gib freeMB freeGiB & call :mb2gib sizeMB sizeGiB
echo %1 %flashmodel%[%filesys%] free %freeGiB% GB of %sizeGiB% GB = %freePCT%%%
exit /b

:mb2gib
@rem double 1000/1024 mb->mib correction
set/a %2 = (125 * ((125 * %1 + 64) / 128) + 64) / 128
@rem 1/1024 mib->gib conversion
set/a %2 = (%2 + 512) / 1024
Exit /b

问题是,如果PC中安装了多个闪存驱动器,我不知道如何循环闪存驱动器模型,是否缺少任何配置?

for /f "usebackq skip=1 tokens=1-6" %%a in (`
    wmic diskdrive where "mediatype='removable media'" get model
  `) do if not defined flashmodel set flashmodel=%%a %%b %%c %%d %%e %%f

这是当前输出

F: Kingston DT 101 G2 USB Device[fat32] free 2 GB of 29 GB = 6%
G: Kingston DT 101 G2 USB Device[NTFS] free 4 GB of 4 GB = 99%

我期望的输出是:

F: Sandisk Ultra USB 3.0 USB Device [fat32] free 2 GB of 29 GB = 6%
G: Kingston DT 101 G2 USB Device[NTFS] free 4 GB of 4 GB = 99%

解决方法

不确定“为此命令创建变量”是什么意思,因此假设您要在多个驱动器的情况下建立单独的变量,

@echo OFF
setlocal
for %%X in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do set "flashdrive%%X="
for /f "usebackq skip=1" %%X in (`
    wmic logicaldisk where "drivetype='2'" 2^>nul get caption
  `) do call :driveusb %%X
set flashdrive
goto :eof

:: -----------------------------------------
:driveusb
set "drive=%~1"
if not defined drive goto :eof
set "freeB=" & set "sizeB="
set "filesys="
set "flashmodel="

for /f "usebackq skip=1 tokens=1,2" %%x in (`
    wmic logicaldisk where "name='%1'" get filesystem
  `) do if not defined filesys set filesys=%%x

for /f "usebackq skip=1 tokens=1-6" %%a in (`
    wmic diskdrive where "mediatype='removable media'" get model
  `) do if not defined flashmodel set flashmodel=%%a %%b %%c %%d %%e %%f

for /f "usebackq skip=1 tokens=1,2" %%X in (`
    wmic logicaldisk where "name='%1'" get freespace^,size
  `) do if not defined freeB (set "freeB=%%X" & set "sizeB=%%Y")

set/a freeMB = %freeB:~0,-6% & set/a sizeMB = %sizeB:~0,-6%
set/a freePCT = (100 * freeMB + sizeMB / 2) / sizeMB
call :mb2gib freeMB freeGiB & call :mb2gib sizeMB sizeGiB
echo %1 %flashmodel%[%filesys%] free %freeGiB% GB of %sizeGiB% GB = %freePCT%%%
set "flashdrive%drive:~0,1%=%1 %flashmodel%[%filesys%] free %freeGiB% GB of %sizeGiB% GB = %freePCT%%%"
exit /b

:mb2gib
:: double 1000/1024 mb->mib correction
set/a %2 = (125 * ((125 * %1 + 64) / 128) + 64) / 128
:: 1/1024 mib->gib conversion
set/a %2 = (%2 + 512) / 1024
Exit /b

为找到的每个驱动器flashdriveX设置X

注意:

添加了setlocal,以避免污染环境
pause替换为goto :eof,以避免通过流通重新调用:driveusb
添加了循环以清除flashdrive变量
@rem和注释行转换为::-注释
:driveusb缺失参数的改进检测方法

在我的系统上显示的结果:

E: USB DISK 2.0 USB Device [FAT32] free 14 GB of 14 GB = 100%
F: USB DISK 2.0 USB Device [FAT32] free 7 GB of 7 GB = 93%
V: USB DISK 2.0 USB Device [FAT32] free 17 GB of 58 GB = 29%
flashdriveE=E: USB DISK 2.0 USB Device [FAT32] free 14 GB of 14 GB = 100%
flashdriveF=F: USB DISK 2.0 USB Device [FAT32] free 7 GB of 7 GB = 93%
flashdriveV=V: USB DISK 2.0 USB Device [FAT32] free 17 GB of 58 GB = 29%

前3行是代码中“ Echo”行的报告。最后3个来自set flashdrive命令,该命令列出了所有以flashdrive开头的环境变量。