我目前正在研究Powershell,并且正在研究一个脚本,该脚本可从Windows系统中获取多显示器的显示配置。在其他人的帮助下,我终于制定了一个完整的脚本来显示每个显示器的分辨率,视频输出类别,制造商和型号。这是完整的脚本:
add-type -assemblyName system.windows.forms
[system.windows.forms.screen]::AllScreens.Bounds | format-list Width,Height |
out-file -append system1.txt
enum VideoOutputTechnology {
UNINITIALIZED = -2
UNKNOW = -1
VGA = 0
S_VIDEO = 1
COMPOSITE_VIDEO = 2
COMPONENT_VIDEO = 3
DVI = 4
HDMI = 5
LVDS_OR_MIPI_DSI = 6
D_JPN = 8
SDI = 9
DISPLAYPORT_EXTERNAL = 10
DISPLAYPORT_EMBEDDED = 11
UDI_EXTERNAL = 12
UDI_EMBEDDED = 13
DONGLE_CABLE_THAT_SUPPORTS_SDTV = 14
MIRACAST_CONNECTED_SESSION = 15
INTERNAL_CONNECTION = 0x80000000
}
Get-WmiObject WmiMonitorconnectionparams -Namespace root\wmi |
Format-List @{
n='VideoOutputTechnology'
e={ [VideoOutputTechnology] $_.VideoOutputTechnology }
} >> system1.txt
Get-WmiObject WmiMonitorID -Namespace root\wmi | ForEach-Object {
[PSCustomObject]@{
Manufacturer = ($_.ManufacturerName | ForEach {[char]$_}) -join ""
Model = ($_.UserFriendlyName | ForEach {[char]$_}) -join ""
}
} | Format-List | Out-File -append system1.txt
system1.txt中的输出为:
Width : 1920
Height : 1080
Width : 2560
Height : 1440
VideoOutputTechnology : DISPLAYPORT_EXTERNAL
VideoOutputTechnology : DVI
Manufacturer : ACI
Model : ASUS PB287Q
Manufacturer : SAM
Model : SMS27A850
我的问题是:如何使每个监视器的输出结果分组。 例如:
Manufacturer: ACI
Model: ASUS PB287Q
Width: 1920
Height: 1080
VideoOutputTechnology: DISPLAYPORT_EXTERNAL
Manufacturer: SAM
Model: SMS27A850
Width: 2560
Height: 1440
VideoOutputTechnology: DVI
提前感谢大家的答复。
答案 0 :(得分:2)
将部分结果放入变量中,然后全部组装成一个[PSCustomObject]
(我不太确定屏幕的顺序是否与MonitorID的顺序匹配)
InstanceName
和WmiMonitorID
共有的属性WmiMonitorconnectionparams
用于同步设置。
编辑:结合了mklement0的提示
EDIT2:添加了属性ProductCodeID,SerialNumberID,Manufactured(年,周)
## Q:\Test\2018\07\16\SO_51368476.ps1
##
enum VideoOutputTechnology {
UNINITIALIZED = -2
UNKNOW = -1
VGA = 0
S_VIDEO = 1
COMPOSITE_VIDEO = 2
COMPONENT_VIDEO = 3
DVI = 4
HDMI = 5
LVDS_OR_MIPI_DSI = 6
D_JPN = 8
SDI = 9
DISPLAYPORT_EXTERNAL = 10
DISPLAYPORT_EMBEDDED = 11
UDI_EXTERNAL = 12
UDI_EMBEDDED = 13
DONGLE_CABLE_THAT_SUPPORTS_SDTV = 14
MIRACAST_CONNECTED_SESSION = 15
INTERNAL_CONNECTION = 0x80000000
}
Add-Type -AssemblyName system.windows.forms
$Screens = [system.windows.forms.screen]::AllScreens.Bounds
$MIDs = Get-WmiObject WmiMonitorID -Namespace root\wmi
$i=0
$AllMonInfo = ForEach ($MID in $MIDs){
$MCP = (Get-WmiObject WmiMonitorconnectionparams -Namespace root\wmi |
Where-Object InstanceName -eq $MID.InstanceName)
[PSCustomObject]@{
Manufacturer = (-join [char[]] $MID.ManufacturerName)
Model = (-join [char[]] $MID.UserFriendlyName)
ProductCodeID= (-join [char[]] $MID.ProductCodeID)
SerialNumberID=(-join [char[]] $MID.SerialNumberID)
Manufactured = ("{0}W{1}" -f $MID.YearOfManufacture,$Mid.WeekOfManufacture.ToString('00'))
Width = $Screens[$i].Width
Height = $Screens[$i].Height
VideoOutput = ([VideoOutputTechnology]$MCP.VideoOutputTechnology)
}
$i++
}
$AllMonInfo | Format-List | Out-File '.\system1.txt' -Append -Encoding ascii
示例输出:
Get-Content '.\system1.txt'
Manufacturer : SAM
Model : SyncMaster
ProductCodeID : 03E7
SerialNumberID : H9XQxxxxxx
Manufactured : 2008W40
Width : 1920
Height : 1200
VideoOutput : DVI
Manufacturer : SAM
Model : SyncMaster
ProductCodeID : 0425
SerialNumberID : H1AKxxxxxx
Manufactured : 2008W10
Width : 1920
Height : 1200
VideoOutput : DVI