dingsir的个人博客分享 http://blog.sciencenet.cn/u/dingsir

博文

Powershell中如何对多个对象进行筛选?

已有 2478 次阅读 2023-3-3 00:59 |个人分类:软件杂谈|系统分类:教学心得

Powershell中如何对多个对象进行筛选?

正式展开前提两个附加知识点:

  1. 先提一个经常用的操作,看看当前的Powershell版本,命令$host.version,通过宿主对象的版本属性来看。将各属性管道输出给Get-member命令,可以看到更多的细节的属性定义。


  1. 再提一个别名的查询,通过别名查正名Get-alias xxx, 反之,通过正名查别名,用get-alias -definition yyy. 如果单纯用Get-Alias则可以得到当前会话中所有可用的别名。

  2. 查询命令网上可以访问   https://learn.microsoft.com/zh-cn/powershell/module/microsoft.powershell.utility/?view=powershell-7.3  这网站提示了非常详尽而完整的命令用法,并且有很好的示例。

PS C:\> get-alias ?
#显示了4个别名
CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ? -> Where-Object
Alias           % -> ForEach-Object
Alias           h -> Get-History
Alias           r -> Invoke-History

PS C:\> get-alias %

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           % -> ForEach-Object

PS C:\> get-alias -definition Get-History

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Alias           ghy -> Get-History
Alias           h -> Get-History
Alias           history -> Get-History

甚至Get-Alias自身也有一个别名gal.

该正文了,下面以磁盘对象为例,利用Get-WMIobject命令检索。

进入了Pwsh(即Powershell 7.3.3的主程序名)的命令行之后,先检索逻辑盘信息,类名用Win32_LogicalDisk。

注意Powershell并不区分大小写,因此以下拼写中小写也不影响结果。

系统有三个盘,一块硬盘分两个区C和D,另一个是虚拟光驱但没有加载内容。

PS C:\> Get-wmiobject  -class Win32_logicaldisk

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 71915470848
Size         : 157286395904
VolumeName   : Win

DeviceID     : D:
DriveType    : 3
ProviderName :
FreeSpace    : 344046698496
Size         : 354821337088
VolumeName   : Data

DeviceID     : E:
DriveType    : 5
ProviderName :
FreeSpace    :
Size         :
VolumeName   :

利用get-wmiobject自带的Filter功能,筛选一下 C盘的信息

PS C:\> Get-wmiobject  -class Win32_logicaldisk -Filter "DeviceID='C:'"

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 71913467904
Size         : 157286395904
VolumeName   : Win

PS C:> Get-wmiobject  -class Win32_logicaldisk -Filter 'DeviceID="C:"'

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 71913467904
Size         : 157286395904
VolumeName   : Win

上述两种方法都可以,差异在于:最后的Filter字串外面是双引号,则包裹C:字串的是单引号;反之亦然。

不同的DriveType(磁盘类型)意义如下

0 -- Unknown(未知)

1 -- No Root directory(没有根目录)

2 -- Removable Disk(可移动磁盘)

3 -- Local Disk(本地磁盘)

4 -- Network Drive(网络驱动器)

5 -- Compact Disc(光盘),虚拟光盘也是此类。

6 -- Ram Disk(RAM磁盘)


筛选一下DriveType为3的盘,注意?就是 where-object命令的别名,筛选的语句中用 -eq,-neq, -like, -notlike等比较符,可以查询最上面提到的网站:

PS C:\> Get-wmiobject  -class Win32_logicaldisk| ? {$_.DriveType -eq 3}

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 71915470848
Size         : 157286395904
VolumeName   : Win

DeviceID     : D:
DriveType    : 3
ProviderName :
FreeSpace    : 344046698496
Size         : 354821337088
VolumeName   : Data

注意上述命令中`$_`代表的是管道传递的当前对象。

对Powershell来讲,命令上看起来是文本在传,背后都是对应的对象在传递,因此后面得到的对象也也包含了各种属性,这点与DOS命令中的管道命令传递的只是文本,有本质的区别。

查看一下这两个DriveType为3的盘的盘符,将它们括起来用点号访问其属性,如DeviceID,FreeSpace等。

PS C:\> (Get-wmiobject  -class Win32_logicaldisk| ? {$_.DriveType -eq 3}).DeviceID
C:
D:

联合两个条件来查询,注意中间用 -and来连接。我开始想当然用&&,结果不行。

PS C:\> (Get-wmiobject  -class Win32_logicaldisk| ? {$_.DriveType -eq 3 -and $_.DeviceID -eq "C:"}).FreeSpace
71915270144

上面这句,如果不用?这个别名,完整的命令应该是

PS C:\> (Get-wmiobject  -class Win32_logicaldisk| where-object -FilterScript {$_.DriveType -eq 3 -and $_.DeviceID -eq "C:"}).FreeSpace
71908749312
# 注意上面的where-object -FilterScript 即相当于?号的作用

如果我想知道一个对象有多少个属性,而不仅仅是列出来的这几个,有以下几种方式:

1)管道传递到Format-List *命令(或者是它的别名 fl *), 比如下面这个命令挑选了盘符为C:的对象,看看它有多少个属性。

PS C:\> Get-wmiobject  -class Win32_logicaldisk| where-object -FilterScript {$_.DeviceID -eq "C:"}| format-list *
>>
PSComputerName               : localhost
RunspaceId                   : 452046ad-8432-49e4-910e-55cad3b4449b
PSShowComputerName           : False
__GENUS                      : 2
__CLASS                      : Win32_LogicalDisk
__SUPERCLASS                 : CIM_LogicalDisk
__DYNASTY                    : CIM_ManagedSystemElement
__RELPATH                    : Win32_LogicalDisk.DeviceID="C:"
__PROPERTY_COUNT             : 40
__DERIVATION                 : {CIM_LogicalDisk, CIM_StorageExtent, CIM_LogicalDevice, CIM_LogicalElement}
__SERVER                     : ZHY-LD-DXH01
__NAMESPACE                  : root\cimv2
__PATH                       : \\ZHY-LD-DXH01\root\cimv2:Win32_LogicalDisk.DeviceID="C:"
Access                       : 0
Availability                 :
BlockSize                    :
Caption                      : C:
Compressed                   : False
ConfigManagerErrorCode       :
ConfigManagerUserConfig      :
CreationClassName            : Win32_LogicalDisk
Description                  : 本地固定磁盘
DeviceID                     : C:
DriveType                    : 3
ErrorCleared                 :
ErrorDescription             :
ErrorMethodology             :
FileSystem                   : NTFS
FreeSpace                    : 71906033664
InstallDate                  :
LastErrorCode                :
MaximumComponentLength       : 255
MediaType                    : 12
Name                         : C:
NumberOfBlocks               :
PNPDeviceID                  :
PowerManagementCapabilities  :
PowerManagementSupported     :
ProviderName                 :
Purpose                      :
QuotasDisabled               :
QuotasIncomplete             :
QuotasRebuilding             :
Size                         : 157286395904
Status                       :
StatusInfo                   :
SupportsDiskQuotas           : False
SupportsFileBasedCompression : True
SystemCreationClassName      : Win32_ComputerSystem
SystemName                   : ZHY-LD-DXH01
VolumeDirty                  :
VolumeName                   : Win
VolumeSerialNumber           : 366AB4DA

可以看到,上述信息中包含了磁盘格式 NTFS,磁盘剩余空间,电脑系统的名字,卷系列号等各种信息。

2)或者select-object *来接收管道信息,效果也一样。但背后的本质稍有不同。 类似的,select *也行。

3)除了 Format-List、 Select-Object,用Get-Member命令来接收管道信息也可以,不过展示出来的内容有所不同,会包含属性,值的类型等信息。

PS C:\> Get-wmiobject  -class Win32_DiskDrive| get-member
  TypeName: Deserialized.System.Management.ManagementObject#root\cimv2\Win32_DiskDrive

Name                        MemberType   Definition
----                        ----------   ----------
GetType                     Method       type GetType()
ToString                    Method       string ToString(), string ToString(string format, System.IFormatProvider form
PSComputerName              NoteProperty string PSComputerName=localhost
PSShowComputerName          NoteProperty bool PSShowComputerName=False
RunspaceId                  NoteProperty guid RunspaceId=452046ad-8432-49e4-910e-55cad3b
......


类似的,查看磁盘驱动器的信息,将类名变成为Win32_DiskDrive.

(以下部分信息用*代替了不等量的实际字符)

PS C:\Users\dingxianghuan> Get-wmiobject  -class Win32_DiskDrive | format-list *
>>
PSComputerName              : localhost
RunspaceId                  : 45*********d-8432-49e4-910e-55c*****4449b
PSShowComputerName          : False
__GENUS                     : 2
__CLASS                     : Win32_DiskDrive
__SUPERCLASS                : CIM_DiskDrive
__DYNASTY                   : CIM_ManagedSystemElement
__RELPATH                   : Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"
__PROPERTY_COUNT            : 51
__DERIVATION                : {CIM_DiskDrive, CIM_MediaAccessDevice, CIM_LogicalDevice, CIM_LogicalElement}
__SERVER                    : ZHY-LD-DXH01
__NAMESPACE                 : root\cimv2
__PATH                      : ****Win32_DiskDrive.DeviceID="\\\\.\\PHYSICALDRIVE0"

Availability                :
BytesPerSector              : 512
Capabilities                : {3, 4}
CapabilityDescriptions      : {Random Access, Supports Writing}
Caption                     : LENSE****MSP****EAT3TA
CompressionMethod           :
ConfigManagerErrorCode      : 0
ConfigManagerUserConfig     : False
CreationClassName           : Win32_DiskDrive
DefaultBlockSize            :
Description                 : 磁盘驱动器
DeviceID                    : \\.\PHYSICALDRIVE0
ErrorCleared                :
ErrorDescription            :
ErrorMethodology            :
FirmwareRevision            : 2.5.0412
Index                       : 0
InstallDate                 :
InterfaceType               : SCSI
LastErrorCode               :
Manufacturer                : (标准磁盘驱动器)
MaxBlockSize                :
MaxMediaSize                :
MediaLoaded                 : True
MediaType                   : Fixed hard disk media
MinBlockSize                :
Model                       : LENSE****MSP****EAT3TA
Name                        : \\.\PHYSICALDRIVE0
NeedsCleaning               :
NumberOfMediaSupported      :
Partitions                  : 2
PNPDeviceID                 : SCSI\DISK&VEN_NVME&PROD_LEN****12GMSP34\5&38****000000
PowerManagementCapabilities :
PowerManagementSupported    :
SCSIBus                     : 0
SCSILogicalUnit             : 0
SCSIPort                    : 0
SCSITargetId                : 0
SectorsPerTrack             : 63
SerialNumber                : A032_99**_36**_6F00.
Signature                   : 12618***71
Size                        : 512105932800
Status                      : OK
StatusInfo                  :
SystemCreationClassName     : Win32_ComputerSystem
SystemName                  : ZHY-LD-DXH01
TotalCylinders              : 62260
TotalHeads                  : 255
TotalSectors                : 1000206900
TotalTracks                 : 15876300
TracksPerCylinder           : 255

这些属性里面的Signature、Model 或 Caption等可以利用,把它们挑选出来吧。当显示的项不超过4项时,Powershell选择用表格,当等于或超过5项时,会默认为列表式输出。

注意select-object的用法,后面跟属性名,用逗号分开。

PS C:\> Get-wmiobject  -class Win32_DiskDrive| select-object Model, Status, Signature, DeviceID
>>
Model                      Status    Signature      DeviceID
-----                      ------    ---------      --------
LENSE****MSP****EAT3TA     OK        12618***71    \\.\PHYSICALDRIVE0

这种表格可能不太好看,可以变成列表形式的,用管道命令format-list *接收即可(用别名fl *也可)

PS C:\> Get-wmiobject  -class Win32_DiskDrive| select-object Model, Status, Signature, DeviceID|format-list *

Model     : LENSE****MSP****EAT3TA
Status    : OK
Signature : 12618***71
DeviceID  : \\.\PHYSICALDRIVE0

select-object *,也可以写成select *。  * 通配符泛指各种形式,也可以使用S*System*这样的形式,表示S或System开头的各种属性。比例下述命令查询计算机系统信息

PS C:\> Get-WmiObject -Class win32_computersystem | select-object S*

Status                    : OK
SupportContactDescription :
SystemFamily              : ThinkPad X280
SystemSKUNumber           : LENOVO_MT_20KF_BU_Think_FM_ThinkPad X280
SystemStartupDelay        :
SystemStartupOptions      :
SystemStartupSetting      :
SystemType                : x64-based PC


我只想显示属性的值,不显示它的属性名,则将属性前加点,例如 如下命令

PS C:\> (Get-wmiobject  -class Win32_DiskDrive).Model
LENSE****MSP****EAT3TA
PS C:\> (Get-wmiobject  -class Win32_DiskDrive).Signature
12618***71

其实对多个对象也可以这么用。

PS C:\> (Get-wmiobject  -class Win32_logicaldisk).DeviceID
C:
D:
E:

上面显示了三项结果,如果只想显示第1项,用索引下标0来表示,如下

PS C:\> (Get-wmiobject  -class Win32_logicaldisk).DeviceID[0]
C:

如果取1,2项,也可以

PS C:\> (Get-wmiobject  -class Win32_logicaldisk).DeviceID[0,1]
C:
D:

如果最后一项,用-1来索引即可。负数表示从后往前计数来索引之。

PS C:\> (Get-wmiobject  -class Win32_logicaldisk).DeviceID[-1]
E:

掌握了这些筛选的方法,要准确的筛选出某个属性就比较容易了。




https://blog.sciencenet.cn/blog-1213210-1378669.html

上一篇:用Lua扩展Editplus的文字处理功能
下一篇:ASCII码与汉字的机内码、GBK码、18030编码及Uncode编码--我的粗浅理解
收藏 IP: 60.177.29.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (1 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-18 21:22

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部