我正在尝试过滤 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