||
正式展开前提两个附加知识点:
先提一个经常用的操作,看看当前的Powershell版本,命令$host.version
,通过宿主对象的版本属性来看。将各属性管道输出给Get-member命令,可以看到更多的细节的属性定义。
再提一个别名的查询,通过别名查正名Get-alias xxx
, 反之,通过正名查别名,用get-alias -definition yyy
. 如果单纯用Get-Alias则可以得到当前会话中所有可用的别名。
查询命令网上可以访问 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:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-25 23:18
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社