如何正确过滤 wmic 磁盘驱动器列表

如何正确过滤 wmic 磁盘驱动器列表

我正在尝试过滤 wmic 列表的结果,where-object但不幸的是,这似乎不起作用。

wmic diskdrive list brief  | Where-Object -Property "Caption" -Contains "Samsung"

过滤后的结果为空,未过滤的结果如下:

Caption                       DeviceID            Model                Partitions  Size

HGST HUH721212ALE600          \\.\PHYSICALDRIVE1  HGST HUH721212ALE600 1           12000132426240
OCZ-VERTEX3                   \\.\PHYSICALDRIVE3  OCZ-VERTEX3          1           240054796800
Samsung SSD 970 EVO Plus 1TB  \\.\PHYSICALDRIVE5  Samsung SSD 970 EVO Plus 1TB  4           1000202273280
ST16000NM001G-2KK103          \\.\PHYSICALDRIVE4  ST16000NM001G-2KK103 1           16000900392960
ST6000NM0024-1HT17Z           \\.\PHYSICALDRIVE0  ST6000NM0024-1HT17Z  1           6001172513280
Samsung SSD 840 PRO Series    \\.\PHYSICALDRIVE2  Samsung SSD 840 PRO Series    1           512105932800

如何正确过滤?

最后,我想要得到DeviceID,例如,PHYSICALDRIVE5

答案1

WMIC 不是 PowerShell cmdlet,并且不包含所Where-Object查找的属性。

您可以通过尝试将命令传送到 来验证这一点Get-Member

使用Select-String另一个答案中提到的方法是过滤 PowerShell 中任何输出的好方法,值得记住。

您还可以从 PowerShell cmdlet 获取从 WMIC 获取的信息,然后所有 PowerShell 过滤和属性命令都会生效。

Get-CimInstance Win32_DiskDrive | Where-Object {$_.Caption -like "*samsung*" }

在我的 AMD 系统上运行此程序会产生以下结果:

PS C:\Users\ishmael> Get-CimInstance Win32_DiskDrive | Where-Object {$_.Caption -like "*AMD*" }

DeviceID           Caption                                   Partitions Size          Model
--------           -------                                   ---------- ----          -----
\\.\PHYSICALDRIVE2 AMD-RAID Samsung SSD 970 SCSI Disk Device 3          1000202273280 AMD-RAID Samsung SSD 970 SCSI Disk Device
\\.\PHYSICALDRIVE1 AMD-RAID Array 2  SCSI Disk Device        1          999091860480  AMD-RAID Array 2  SCSI Disk Device

命令分解

获取 CimInstance

CIM 命令被添加以替代 WMI 命令。CIM 代表通用信息模型,在此实例中用于访问一组有关 Windows 的标准化信息。糖尿病足底康复训练中心 红门 MS CimCmdlet

Win32_磁盘驱动器

可供查询的 CIM 类之一。有许多 CIM 类。尝试Get-CimClass Win32*了解以 Win32 为前缀的可用 CIM 类的类型。

|

管道。将左侧的输出发送到右侧的命令。

哪里对象

Where-Object 可用于过滤已通过管道传输的 PowerShell 输出。要查看可以过滤哪些类型的对象,请先将命令通过管道传输到该对象Get-Member,这将显示可能的对象列表。

{$_.Caption 类似"三星“}

  • $_PowerShell 语法是自己. 指的是管道输入。
  • .Caption$_我们想要查询的成员对象
  • -like允许通配符模式的 PowerShell 比较运算符PS 运算符
  • "*samsung*"我们的搜索字符串,通配符星号位于字符串的前面和后面,以确保匹配三星输出中的任意位置。省略前导通配符将显示仅以三星

答案2

我正在尝试过滤wmic列表的结果,where-object但是这不起作用。

我在用着:

wmic diskdrive list brief  | Where-Object -Property "Caption" -Contains "Samsung"

要查找包含字符串“Samsung”的行,请使用以下命令:

wmic diskdrive list brief  | select-string -pattern "Samsung*"

按照你的例子它应该返回:

Samsung SSD 970 EVO Plus 1TB  \\.\PHYSICALDRIVE5  Samsung SSD 970 EVO Plus 1TB  4           1000202273280
Samsung SSD 840 PRO Series    \\.\PHYSICALDRIVE2  Samsung SSD 840 PRO Series    1           512105932800

答案3

这并不能直接回答你的问题。[咧嘴笑] 但是,它提供了您使用的 WMIC.exe 调用的更“powershell-ish”的版本。

它能做什么 ...

  • 设置要过滤的目标字符串
  • 获取所有磁盘的磁盘信息
  • 过滤掉不需要的磁盘
  • 构建一个仅具有所需属性的新对象,
    WMIC“DeviceID”项似乎映射到“.DiskNumber”属性。
  • 修剪掉序列号属性中不需要的“一串前导空格”
  • 将其发送给 $Var
  • 屏幕上显示

这是代码...

$Maker = 'crucial'

$TargetDiskInfo = Get-Disk |
    Where-Object -Property FriendlyName -Match $Maker |
    Select-Object -Property DiskNumber, Manufacturer, Model,
        # the SN on my ssd has a BUNCH of leading whitespace
        #    the ".Trim()" gets rid of that
        @{n = 'SerialNumber'; e = {$_.SerialNumber.Trim()}}

$TargetDiskInfo

输出 ...

DiskNumber Manufacturer Model            SerialNumber
---------- ------------ -----            ------------
         0 Crucial_     CT1024MX200S     153910A893E4

相关内容