Board logo

标题: [问题求助] PowerShell怎样用wmi相关的命令获取硬盘信息? [打印本页]

作者: 小白龙    时间: 2024-9-5 10:05     标题: PowerShell怎样用wmi相关的命令获取硬盘信息?

我想用powershell中wmi相关的命令, 获取系统分区所在的硬盘上总共的分区数量, 下面是ai的代码, 输出有错误信息, 但是返回值正常, 我想用wmi命令来实现, 求路过大佬支招
  1. # 获取系统分区所在的硬盘号
  2. $systemDriveLetter =$env:SystemDrive # 通常为C:
  3. $diskNumber = (Get-Partition -DriveLetter $systemDriveLetter).DiskNumber
  4. # 获取该硬盘上的所有分区
  5. $partitions = Get-Partition -DiskNumber $diskNumber
  6. # 计算分区数量
  7. $partitionCount =$partitions.Count
  8. # 输出分区数量
  9. $partitionCount
复制代码

作者: flashercs    时间: 2024-9-5 10:35

  1. $systemDriveLetter =$env:SystemDrive # 通常为C:
  2. $diskNumber = (Get-Partition -DriveLetter $systemDriveLetter[0]).DiskNumber
  3. # 获取该硬盘上的所有分区
  4. $partitions = Get-Partition -DiskNumber $diskNumber
  5. # 计算分区数量
  6. $partitionCount =$partitions.Count
  7. # 输出分区数量
  8. $partitionCount
复制代码

作者: 小白龙    时间: 2024-9-5 17:35

回复 2# flashercs


    多谢大佬帮助, 有用wmic的解决方法吗?
作者: flashercs    时间: 2024-9-5 18:19

  1. @echo off
  2. for /f "delims=" %%A in ('wmic /namespace:"\\ROOT\Microsoft\Windows\Storage" path MSFT_Partition where "DriveLetter='C'" get DiskNumber /value^|findstr "="') do (
  3.   for /f "delims=" %%B in ("%%A") do (
  4.     for /f "delims=" %%C in ('wmic /namespace:"\\ROOT\Microsoft\Windows\Storage" path MSFT_Partition where "%%B" get DiskNumber /value^|find /c "="') do (
  5.       set partitionCount=%%C
  6.     )
  7.   )
  8. )
  9. echo partitionCount=%partitionCount%
  10. pause
复制代码

作者: 小白龙    时间: 2024-9-5 21:10

回复 4# flashercs


    大佬能帮看一下下面代码吗? 好多命令行的代码在powershell下都能直接使用, 但是下面这两行代码, 在CMD中都可以执行成功, 但是在Powershell中都不灵, 能指导一下哪里的问题吗? GPT都被问晕了, 也没解决
  1. wmic path Win32_LogicalDiskToPartition.Dependent="Win32_LogicalDisk.DeviceID='c:'"
  2. wmic path Win32_LogicalDiskToPartition.Dependent='Win32_LogicalDisk.DeviceID="c:"'
复制代码

作者: flashercs    时间: 2024-9-5 21:16

本帖最后由 flashercs 于 2024-9-5 21:41 编辑

回复 5# 小白龙
powershell中的command类型列表:
  1. PS> [System.Management.Automation.CommandTypes]|Get-EnumValues
  2. Alias                :        1  00000001  00000000 00000001
  3. Function             :        2  00000002  00000000 00000010
  4. Filter               :        4  00000004  00000000 00000100
  5. Cmdlet               :        8  00000008  00000000 00001000
  6. ExternalScript       :       16  00000010  00000000 00010000
  7. Application          :       32  00000020  00000000 00100000
  8. Script               :       64  00000040  00000000 01000000
  9. Workflow             :      128  00000080  00000000 10000000
  10. Configuration        :      256  00000100  00000001 00000000
  11. All                  :      511  000001FF  00000001 11111111
复制代码
wmic.exe属于Application类型;对于Application类型,参数列表是以空格分隔的 多个字符串;每个参数放到一个字符串中就好了;
  1. wmic path "Win32_LogicalDiskToPartition.Dependent=`"Win32_LogicalDisk.DeviceID='c:'`""
  2. wmic path "Win32_LogicalDiskToPartition.Dependent='Win32_LogicalDisk.DeviceID=`"c:`"'"
复制代码
另外,
如果直接拿cmd中的命令复制到powershell中使用,还可以使用 verbatim operator --%,在 参数列表前使用,那么后面的参数不需要转义,例如:
  1. wmic --% path Win32_LogicalDiskToPartition.Dependent="Win32_LogicalDisk.DeviceID='c:'"
  2. wmic --% path Win32_LogicalDiskToPartition.Dependent='Win32_LogicalDisk.DeviceID="c:"'
复制代码

作者: 小白龙    时间: 2024-9-5 21:53

回复 6# flashercs


    大佬研究的太透了, 感谢分享
作者: 小白龙    时间: 2024-9-5 22:28

回复 6# flashercs


    大佬, #6楼的代码中的下面的代码, 在我的电脑上无法执行, 这个Get-EnumValues 是自定义的命令吗? 能分享一下吗?
[System.Management.Automation.CommandTypes]|Get-EnumValues
作者: flashercs    时间: 2024-9-5 22:47

本帖最后由 flashercs 于 2024-9-5 23:04 编辑

回复 8# 小白龙
powershell中利用wmi对象解决,但是 获取分区数量少了1个,缺少了MSR分区
  1. # wmi class具有类似关系数据库的relations,利用 Win32_LogicalDisk 与 Win32_DiskPartition的关系,从子对象Win32_LogicalDisk='C:'得到关联的父对象 Win32_DiskPartition
  2. $part1=Get-WmiObject -Query "associators of {Win32_LogicalDisk.DeviceID='C:'} where ResultClass=Win32_DiskPartition " -Namespace "root\cimv2"
  3. # 获取$part1的前缀
  4. $diskId1=($part1.DeviceID -split ',')[0]
  5. # 查询$part1所在磁盘的所有分区
  6. $parts=Get-WmiObject -Query "select DeviceID from Win32_DiskPartition where DeviceID like '${diskId1},%'"
  7. # 获取分区数量
  8. $partsCount=$parts.Count
复制代码
如果是ps5.1,建议使用 CimCmdlets而不是wmi,例如获取上面查询的 associators of可以用: Get-CimAssociatedInstance
作者: flashercs    时间: 2024-9-5 22:50

回复 8# 小白龙
  1. function Global:Get-EnumValues {
  2.   [CmdletBinding()]
  3.   [OutputType([string[]])]
  4.   param (
  5.     [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
  6.     [ValidateNotNullOrEmpty()]
  7.     [ValidateScript( { $_.IsSubclassOf([Enum]) })]
  8.     [Type]$EnumType,
  9.     [Parameter(Mandatory = $false, Position = 1)]
  10.     [ValidateNotNullOrEmpty()]
  11.     [int]$NameWidth = -20,
  12.     [Parameter(Mandatory = $false, Position = 2)]
  13.     [ValidateNotNullOrEmpty()]
  14.     [int]$ValueWidth = 8,
  15.     [Parameter(Mandatory = $false, Position = 3)]
  16.     [ValidateNotNullOrEmpty()]
  17.     [int]$HexWidth = 8,
  18.     [Parameter(Mandatory = $false, Position = 4)]
  19.     [ValidateNotNullOrEmpty()]
  20.     [int]$BinaryWidth = 16,
  21.     [Parameter(Mandatory = $false, Position = 5)]
  22.     [switch]$NoSplitBinary
  23.   )
  24.   [char]$c = '0'
  25.   [Enum]::GetNames($EnumType) | ForEach-Object {
  26.     $value = $EnumType::$_
  27.     $strBinary = [Convert]::ToString([long]$value, 2).PadLeft(${BinaryWidth}, $c)
  28.     if (!$NoSplitBinary) {
  29.       $strBinary = $strBinary -replace ".{8}(?!=$)", "$& "
  30.     }
  31.     "{0,${NameWidth}:g} : {1,${ValueWidth}:d}  {2,${HexWidth}:x}  {3,${BinaryWidth}}" -f `
  32.     @($_, $value, $value, $strBinary)
  33.   }
  34. }
复制代码

作者: 小白龙    时间: 2024-9-18 10:23

回复 6# flashercs
大佬, 下面的批处理在powershell中用--%的方式执行, 没有任何反应, 不加也不行, 有解吗?

sc --% stop "WMPNetworkSvc"
sc --% stop "wsearch"
sc --% config "WMPNetworkSvc" start= disabled
sc --% config "wsearch" start= disabled

源批处理:
sc stop "WMPNetworkSvc"
sc stop "wsearch"
sc config "WMPNetworkSvc" start= disabled
sc config "wsearch" start= disabled
作者: flashercs    时间: 2024-9-18 16:21

回复 11# 小白龙
  1. sc.exe --% stop "WMPNetworkSvc"
  2. sc.exe --% stop "wsearch"
  3. sc.exe --% config "WMPNetworkSvc" start= disabled
  4. sc.exe --% config "wsearch" start= disabled
复制代码

作者: 小白龙    时间: 2024-9-18 20:26

回复 12# flashercs


    牛X




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2