标题: [问题求助] PowerShell怎样用wmi相关的命令获取硬盘信息? [打印本页]
作者: 小白龙 时间: 2024-9-5 10:05 标题: PowerShell怎样用wmi相关的命令获取硬盘信息?
我想用powershell中wmi相关的命令, 获取系统分区所在的硬盘上总共的分区数量, 下面是ai的代码, 输出有错误信息, 但是返回值正常, 我想用wmi命令来实现, 求路过大佬支招- # 获取系统分区所在的硬盘号
- $systemDriveLetter =$env:SystemDrive # 通常为C:
- $diskNumber = (Get-Partition -DriveLetter $systemDriveLetter).DiskNumber
-
- # 获取该硬盘上的所有分区
- $partitions = Get-Partition -DiskNumber $diskNumber
-
- # 计算分区数量
- $partitionCount =$partitions.Count
-
- # 输出分区数量
- $partitionCount
复制代码
作者: flashercs 时间: 2024-9-5 10:35
- $systemDriveLetter =$env:SystemDrive # 通常为C:
- $diskNumber = (Get-Partition -DriveLetter $systemDriveLetter[0]).DiskNumber
-
- # 获取该硬盘上的所有分区
- $partitions = Get-Partition -DiskNumber $diskNumber
-
- # 计算分区数量
- $partitionCount =$partitions.Count
-
- # 输出分区数量
- $partitionCount
复制代码
作者: 小白龙 时间: 2024-9-5 17:35
回复 2# flashercs
多谢大佬帮助, 有用wmic的解决方法吗?
作者: flashercs 时间: 2024-9-5 18:19
- @echo off
- for /f "delims=" %%A in ('wmic /namespace:"\\ROOT\Microsoft\Windows\Storage" path MSFT_Partition where "DriveLetter='C'" get DiskNumber /value^|findstr "="') do (
- for /f "delims=" %%B in ("%%A") do (
- for /f "delims=" %%C in ('wmic /namespace:"\\ROOT\Microsoft\Windows\Storage" path MSFT_Partition where "%%B" get DiskNumber /value^|find /c "="') do (
- set partitionCount=%%C
- )
- )
- )
- echo partitionCount=%partitionCount%
- pause
复制代码
作者: 小白龙 时间: 2024-9-5 21:10
回复 4# flashercs
大佬能帮看一下下面代码吗? 好多命令行的代码在powershell下都能直接使用, 但是下面这两行代码, 在CMD中都可以执行成功, 但是在Powershell中都不灵, 能指导一下哪里的问题吗? GPT都被问晕了, 也没解决- wmic path Win32_LogicalDiskToPartition.Dependent="Win32_LogicalDisk.DeviceID='c:'"
- wmic path Win32_LogicalDiskToPartition.Dependent='Win32_LogicalDisk.DeviceID="c:"'
复制代码
作者: flashercs 时间: 2024-9-5 21:16
本帖最后由 flashercs 于 2024-9-5 21:41 编辑
回复 5# 小白龙
powershell中的command类型列表:- PS> [System.Management.Automation.CommandTypes]|Get-EnumValues
- Alias : 1 00000001 00000000 00000001
- Function : 2 00000002 00000000 00000010
- Filter : 4 00000004 00000000 00000100
- Cmdlet : 8 00000008 00000000 00001000
- ExternalScript : 16 00000010 00000000 00010000
- Application : 32 00000020 00000000 00100000
- Script : 64 00000040 00000000 01000000
- Workflow : 128 00000080 00000000 10000000
- Configuration : 256 00000100 00000001 00000000
- All : 511 000001FF 00000001 11111111
复制代码
wmic.exe属于Application类型;对于Application类型,参数列表是以空格分隔的 多个字符串;每个参数放到一个字符串中就好了;- wmic path "Win32_LogicalDiskToPartition.Dependent=`"Win32_LogicalDisk.DeviceID='c:'`""
- wmic path "Win32_LogicalDiskToPartition.Dependent='Win32_LogicalDisk.DeviceID=`"c:`"'"
复制代码
另外,
如果直接拿cmd中的命令复制到powershell中使用,还可以使用 verbatim operator --%,在 参数列表前使用,那么后面的参数不需要转义,例如:- wmic --% path Win32_LogicalDiskToPartition.Dependent="Win32_LogicalDisk.DeviceID='c:'"
- 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分区- # wmi class具有类似关系数据库的relations,利用 Win32_LogicalDisk 与 Win32_DiskPartition的关系,从子对象Win32_LogicalDisk='C:'得到关联的父对象 Win32_DiskPartition
- $part1=Get-WmiObject -Query "associators of {Win32_LogicalDisk.DeviceID='C:'} where ResultClass=Win32_DiskPartition " -Namespace "root\cimv2"
- # 获取$part1的前缀
- $diskId1=($part1.DeviceID -split ',')[0]
- # 查询$part1所在磁盘的所有分区
- $parts=Get-WmiObject -Query "select DeviceID from Win32_DiskPartition where DeviceID like '${diskId1},%'"
- # 获取分区数量
- $partsCount=$parts.Count
复制代码
如果是ps5.1,建议使用 CimCmdlets而不是wmi,例如获取上面查询的 associators of可以用: Get-CimAssociatedInstance
作者: flashercs 时间: 2024-9-5 22:50
回复 8# 小白龙 - function Global:Get-EnumValues {
- [CmdletBinding()]
- [OutputType([string[]])]
- param (
- [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
- [ValidateNotNullOrEmpty()]
- [ValidateScript( { $_.IsSubclassOf([Enum]) })]
- [Type]$EnumType,
- [Parameter(Mandatory = $false, Position = 1)]
- [ValidateNotNullOrEmpty()]
- [int]$NameWidth = -20,
- [Parameter(Mandatory = $false, Position = 2)]
- [ValidateNotNullOrEmpty()]
- [int]$ValueWidth = 8,
- [Parameter(Mandatory = $false, Position = 3)]
- [ValidateNotNullOrEmpty()]
- [int]$HexWidth = 8,
- [Parameter(Mandatory = $false, Position = 4)]
- [ValidateNotNullOrEmpty()]
- [int]$BinaryWidth = 16,
- [Parameter(Mandatory = $false, Position = 5)]
- [switch]$NoSplitBinary
- )
- [char]$c = '0'
- [Enum]::GetNames($EnumType) | ForEach-Object {
- $value = $EnumType::$_
- $strBinary = [Convert]::ToString([long]$value, 2).PadLeft(${BinaryWidth}, $c)
- if (!$NoSplitBinary) {
- $strBinary = $strBinary -replace ".{8}(?!=$)", "$& "
- }
- "{0,${NameWidth}:g} : {1,${ValueWidth}:d} {2,${HexWidth}:x} {3,${BinaryWidth}}" -f `
- @($_, $value, $value, $strBinary)
- }
- }
复制代码
作者: 小白龙 时间: 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# 小白龙 - sc.exe --% stop "WMPNetworkSvc"
- sc.exe --% stop "wsearch"
- sc.exe --% config "WMPNetworkSvc" start= disabled
- sc.exe --% config "wsearch" start= disabled
复制代码
作者: 小白龙 时间: 2024-9-18 20:26
回复 12# flashercs
牛X
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |