为所有检测到的 HDD 添加 VolumeName

Posted

技术标签:

【中文标题】为所有检测到的 HDD 添加 VolumeName【英文标题】:Add VolumeName for all detected HDD's 【发布时间】:2022-01-05 21:44:45 【问题描述】:

好的,所以我有以下 Windows 批处理脚本,它可以为所有连接的存储设备(内部 HDD/外部 USB 驱动器)提取信息,它工作得很好。但是,我想在每个检测到的驱动器的名称之后添加:Volume x:\,就像这样:Volume x:\ NAME OF HDD HERE

call :setESC

call :hdd-info

endlocal
echo. Press any key to exit &>nul timeout /t -1 &exit /B

REM - Setup ANSI Escape Character ------------------------------------------------
:setESC
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set ESC=%%b
  exit /B 0
)
REM ------------------------------------------------------------------------------

:: - Get Storage / HDD Info ------------------------------------------------------
:hdd-info
:: Enable use of Unicode symbols
chcp 65001 >nul
set "GB=1073741824"
for /f "skip=1 delims=" %%i in ('%SystemRoot%\System32\wbem\wmic.exe logicaldisk get deviceid^,freespace^,size^') do (for /f "tokens=1-3" %%j in ("%%i") do call :output %%j %%k %%l)
:: Disable Unicode symbols
chcp 1252 >nul
goto :eof

:output
if "%3"=="" (
  :: echo. Volume %optical_drive_letter%\ - %optical_drive_type% ^(%optical_drive_name%^)
goto :eof
)

for /f "tokens=1-4" %%i in (
  'mshta vbscript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write(FormatNumber(%3/%GB%, 2) & "" "" & FormatNumber((%3-%2)/%GB%, 2) & "" "" & FormatNumber(%2/%GB%, 2) & "" "" & Round((%3-%2)*50/%3)):Close"^)'
) do (
  set "size=%%i"
  set "used=%%j"
  set "free=%%k"
  set /a "nUsed=%%l, nFree=50-%%l"
)

echo( Volume %1\
echo( Total Size          : %size:~-10%GB
echo( Used Space          : %used:~-10%GB
echo( Free Space          : %free:~-10%GB
for /l %%i in (1 1 %nUsed%) do <nul set /p "=%ESC%[91m▓%ESC%[30m"
for /l %%i in (1 1 %nFree%) do <nul set /p "=%ESC%[92m▓%ESC%[30m"
echo( &echo(
goto :eof
:: ------------------------------------------------------------------------------

输出如下:https://imgshare.io/image/list-hdds.rN55xP

现在,我还有以下显示光驱的示例,作为我需要的布局/信息的示例。 IE:在卷标后面添加的设备名称。

请注意 此代码仅作为示例。

:: - Get Optical Drive(s) Information -----------------------------------------------
for /f "skip=2 tokens=2,3 delims=," %%i in (
  '%SystemRoot%\System32\wbem\wmic.exe logicaldisk where "drivetype=5" get Caption^ /format:csv'
) Do (
    set "optical_drive_letter=%%i"
)

for /f "tokens=2,3 delims=," %%a in (
  '%SystemRoot%\System32\wbem\wmic.exe cdrom where "mediatype!=11" get name^,mediatype /format:csv'
) Do (
  set "optical_drive_type=%%a"
  set "optical_drive_name=%%b"
)

::echo( Volume %optical_drive_letter%\ 
::echo( %optical_drive_description%/%optical_drive_type% (%optical_drive_name%)
:: ------------------------------------------------------------------------------

echo( Volume %optical_drive_letter%\
echo( %optical_drive_type% (%optical_drive_name%)
echo(

因此,为了澄清上述内容,会像初始脚本一样显示卷标。但是,它也显示设备名称。

https://imgshare.io/image/list-optical.rN5bbu

我知道我可以使用 wmic.exe logicaldisk get Caption 在 CMD 中获取此内容,因此可以在批处理文件中使用类似的内容:

for /f "delims=^= tokens=2" %%a in ('%SystemRoot%\System32\wbem\wmic.exe PATH Win32_DiskDrive GET Caption /format:list ^| findstr ^=') do set logicaldisk_name=%%a

我的问题是我不知道如何更改原始脚本以获取并显示检测到的每个物理驱动器的每个设备名称。

任何人都可以帮忙解决这个问题,因为我似乎正在努力让所有连接的驱动器都能正常工作?

完整的脚本可以在这里找到:https://pastebin.com/q5QS4EmF

非常感谢,

布里

【问题讨论】:

for /f "tokens=1,2*delims==" %%a in ('"%SystemRoot%\System32\wbem\wmic.exe" logicaldisk get volumename /format:list') do if "%%b" neq "" echo %%bfor /f "skip=2tokens=2*delims=," %%a in ('"%SystemRoot%\System32\wbem\wmic.exe" logicaldisk get volumename /format:csv') do echo %%a 【参考方案1】:

如果我正确理解您的问题,您希望确定所有附加逻辑磁盘的驱动器号、卷名和磁盘使用属性。

    打开 PowerShell ISE。 将以下代码粘贴到脚本窗格中。 按播放(绿色箭头)。
$DriveInformation = Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object DeviceID, VolumeName, Description, @'Name' = 'Total Size (GB)'; Expression = [int]($_.Size/1GB), @'Name' = 'Used (GB)'; Expression = [int](($($_.Size)-$($_.FreeSpace))/1GB), @'Name' = 'Available  (GB)'; Expression = [int]($_.FreeSpace/1GB)
$DriveInformation

奖金 如果要将其导出到文件,可以将 $DriveInformation 的结果通过管道传输到特定格式。示例如下;

$DriveInformation | Export-Csv "C:\temp\driveinformation.csv" -NoTypeInformation -Force
Start-Process "C:\temp\driveinformation.csv"

编辑1: 我应该注意,您可以将脚本保存为 .ps1,它可以像批处理文件一样运行。

【讨论】:

首先我要感谢那些提供解决方案的人。但是,我认为对于我到底需要什么可能会有些困惑。我已经有一个工作脚本来显示所有检测到的 HDD 的 Total Size、** Used Space** 和 Free Space,但它只显示驱动器号。我也需要它来显示 VolumeName。我知道如何获取此信息 (wmic.exe logicaldisk get volumename),但不知道如何将此信息合并到现有脚本中以使其列出每个检测到的驱动器的每个新名称。 请注意:我只包含用于光驱(和图像)的单独脚本,以显示我需要的第一个脚本的建议布局,该脚本显示物理驱动器的信息。澄清更多:它目前显示Volume C:\,但我需要它显示(例如)Volume C:\ Samsung SSD 840 EVO,以及它找到的下一个,Volume D:\ 'HDD name here' 等... @Bri,你确定你在找什么吗?我问是因为在您上面的初始评论中,您正在谈论卷的名称,而在您的后续评论中,是包含该卷的磁盘的型号名称。您是说%SystemRoot%\System32\wbem\WMIC.exe" LogicalDisk Where "DeviceID='C:'" Get VolumeName /Format:'List' 返回VolumeName=Samsung SSD 840 EVO,即您已专门标记您的卷Samsung SSD 840 EVO,这也恰好是该卷所在磁盘的型号名称。 Compo,原始脚本显示每个“卷标”,即驱动器号。然后我需要做的是让它也自动添加驱动器的名称。 请查看以下内容:imgshare.io/image/capture.rNSgtg 您会看到每个硬盘只显示Volume C:\。但是,我希望每个都像前面所说的那样显示设备名称,就像显示 Volume F:\ DVD Writer(然后在此处命名)的单独代码位一样。我假设我只需要添加正确的命令来获取设备的名称,但我不知道获取名称是什么:wmic.exe logicaldisk get deviceid^,freespace^,size^') do (for /f "tokens=1-3" %%j in ("%%i") do call :output %%j %%k %%l)【参考方案2】:

不启动 WMIC.exemshta.exe(调用 VBScript 引擎);并结合其他答案中提供的更好的powershell.exe,这是一个示例batch-file,您可以尝试或学习。

@%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -NoProfile ^
 "Get-CimInstance -ClassName Cim_Diskdrive -PipelineVariable Disk | "^
 "ForEach-Object  $_ | Get-CimAssociatedInstance -ResultClassName Cim_DiskPartition -PipelineVariable Partition  | "^
 "ForEach-Object  $_ | Get-CimAssociatedInstance -ResultClassName Cim_LogicalDisk  | "^
 "Format-Table @ Label = 'Letter';      Expression =  $_.DeviceId  , "^
 "             @ Label = 'Model';       Expression =  $Disk.Model.Trim()  , "^
 "             @ Label = 'Capacity';    Expression =  '0:F0 GB' -F ($Disk.Size / 1000000000)  , "^
 "             @ Label = 'Partition';   Expression =  $Partition.Index  , "^
 "             @ Label = 'Label';       Expression =  $_.VolumeName  , "^
 "             @ Label = 'Size';        Expression =  '0:F1 GiB' -F ($_.Size / 1GB)  , "^
 "             @ Label = 'Used';        Expression =  '0:F1 GiB' -F (($_.Size - $_.FreeSpace) / 1GB)  , "^
 "             @ Label = 'FreeSpace';   Expression =  '0:F1 GiB' -F ($_.FreeSpace / 1GB)  , "^
 "             @ Label = 'PercentFree'; Expression =  '0:P1' -F ($_.FreeSpace / $_.Size)   -AutoSize"
@Pause

我知道您希望可以将答案合并到您发布的代码提交中,但为了获得您需要的结果,您的整个脚本需要重新编写并生成代码会明显更慢、更复杂,并且很难理解和适应。

【讨论】:

【参考方案3】:

这是完美运行的最新代码:

setlocal enabledelayedexpansion
for /F "delims=^=,# tokens=3,6" %%A in ('%SystemRoot%\System32\wbem\wmic.exe path Win32_LogicalDiskToPartition get Antecedent^,Dependent ^| find "="') do (
    set "disk[%%A]=%%B"
)

set "name=0"
set "GB=1073741824"
for /F "delims=^= tokens=2" %%A in ('%SystemRoot%\System32\wbem\wmic.exe path Win32_DiskDrive get Caption^,Index /value ^| find "="') do (
    if !name! EQU 0 (
        set hdd_name=%%A
        set "name=1"
    ) else (
        set "disk=%%A"
        for %%Q in (!disk: ^=!) do (
            for /F "skip=1 tokens=1-3 delims= " %%I in ('%SystemRoot%\System32\wbem\wmic.exe LogicalDisk !disk[%%Q]! get DeviceId^,Freespace^,Size') do (
                for %%L in (%%I) do (
                    call :output %%I %%J %%K
                )
            )
        )
        SET "name=0"
    )
)

【讨论】:

以上是关于为所有检测到的 HDD 添加 VolumeName的主要内容,如果未能解决你的问题,请参考以下文章

将检测到的 2D 地图调整为参考 2D 地图

html 添加在隐藏字段中检测到的国家

ceph SSD HDD分离与openstack调用

Ionic2 - 根据检测到的设备名称,将全局类添加到整个应用程序页面

几篇深度图人体检测论文的实现

unity3d 怎么检测碰撞?比如主角碰撞到物体之后销毁被撞到的物体