我目前正在研究Powershell,并且正在研究从Windows系统获取Display配置的脚本。我有2个问题:
问题1.脚本是:
"Display Config" >> system1.txt
"----------------------------------------------------------------------------
---------------------------------" >> system1.txt
add-type -assemblyName system.windows.forms
[system.windows.forms.screen]::AllScreens | Format-List Bounds | out-file -append system1.txt
输出是2台显示器分辨率的结果,就像这样:
Bounds : {X=0,Y=0,Width=1920,Height=1080}
Bounds : {X=1920,Y=0,Width=2560,Height=1440}
但是我只想提取'Width'和'Height'的值,并且make输出显示为:
Width:1920
Height:1080
Width:2560
Height:1440
问题2:对于此脚本:
Get-WmiObject WmiMonitorconnectionparams -Namespace root\wmi | format-List
VideoOutputTechnology | out-file -append system1.txt
我得到结果:
VideoOutputTechnology : 10
VideoOutputTechnology : 4
但是值4和10需要解码,即根据URL https://technet.microsoft.com/en-us/ff546605(v=vs.89)
来解码'10 = Displayport External'
我该如何根据URL解码值并使结果仅在输出txt中显示为'Displayport External'
?
非常感谢您的答复。
答案 0 :(得分:2)
问题1 :
LotPings在评论(PSv3 +)中有效地提供了一种解决方案:
[system.windows.forms.screen]::AllScreens.Bounds | Format-List Width, Height >> system1.txt
.Bounds
直接应用于::AllScreens
返回的 array ,在这种情况下,该数组的 elements'数组.Bounds
属性值可以方便地返回,这是称为member enumeration的PSv3 +功能。
Format-List Width, Height
然后从生成的.Width
实例中提取.Height
和[System.Drawing.Rectangle]
属性值,并将它们显示为列表。
Format-*
cmdlet的目的是创建输出仅用于显示,即生成对人类观察者友好但不适合进一步< em>程序化处理。由于您使用的是Out-File -Append
,而没有其他选项,因此>>
是便捷的快捷方式。 (您将获得UTF16-LE编码(“ Unicode”)文件。)
问题2 :
PowerShell对.NET枚举(源自[enum]
的类型)具有强大的内置支持,但是您的情况下WMI报告的是简单的 integers [System.UInt32]
,因此您必须执行自己的映射。
在PSv5 +中,您可以定义自己的[enum]
类型,在这种情况下,对该类型进行简单的 cast 可以帮助您:
enum VideoOutputTechnology {
D3DKMDT_VOT_UNINITIALIZED = -2
D3DKMDT_VOT_OTHER = -1
D3DKMDT_VOT_HD15 = 0
# ...
D3DKMDT_VOT_DVI = 4
D3DKMDT_VOT_DISPLAYPORT_EXTERNAL = 10
# ...
}
在PSv4-中,您可以使用Add-Type -TypeDefinition
通过包含 C#枚举定义的字符串来定义枚举。
注意:
我保留了https://technet.microsoft.com/en-us/ff546605(v=vs.89)中的原始符号常量名称,但是您可以随意将其重命名为更友好的名称。例如D3DKMDT_VOT_DISPLAYPORT_EXTERNAL
-> Displayport_External
-但请注意, 不允许包含空格和特殊字符。如果还不够友好,请考虑使用Theo's helpful solution。
您正在创建符号常量的 static 副本,因此这两组可能不同步,尽管可能很少添加新的常量。
(我不知道有任何预先定义过这些常量的.NET枚举类型,它们似乎是在*.h
文件中定义的,您不能假定它们存在于每台机器上;您可以通过网络方式刮除URL,但这很脆弱。)
然后您可以在calculated property的上下文中应用强制转换,以便将原始整数转换为符号名称:
Get-WmiObject WmiMonitorconnectionparams -Namespace root\wmi |
Format-List @{
n='VideoOutputTechnology'
e={ [VideoOutputTechnology] $_.VideoOutputTechnology }
} >> system1.txt
这应该产生:
VideoOutputTechnology : D3DKMDT_VOT_DISPLAYPORT_EXTERNAL
VideoOutputTechnology : D3DKMDT_VOT_DVI
答案 1 :(得分:0)
对于VideoOutputTechnology
值。是的,它们是来自D3DKMDT_VIDEO_OUTPUT_TECHNOLOGY
枚举的值,但是我相信您想返回一个更具描述性的字符串。在这种情况下,您可以使用一个小函数将值转换为字符串:
function Resolve-VideoOutputTechnology {
[CmdletBinding()]
param(
[Parameter(ValueFromPipeline = $true, Mandatory = $true, Position = 0)]
[int64]$VideoOutputTechnology
)
switch ($VideoOutputTechnology) {
-2 { return 'Uninitialized connector' } # D3DKMDT_VOT_UNINITIALIZED
-1 { return 'Unknown connector' } # D3DKMDT_VOT_OTHER
0 { return 'VGA connector' } # D3DKMDT_VOT_HD15
1 { return 'S-video connector' } # D3DKMDT_VOT_SVIDEO
2 { return 'Composite video connector' } # D3DKMDT_VOT_COMPOSITE_VIDEO
3 { return 'Component video connector' } # D3DKMDT_VOT_COMPONENT_VIDEO
4 { return 'Digital Video Interface (DVI) connector' } # D3DKMDT_VOT_DVI
5 { return 'High-Definition Multimedia Interface (HDMI) connector' } # D3DKMDT_VOT_HDMI
6 { return 'Low Voltage Differential Swing (LVDS) or Mobile Industry Processor Interface (MIPI) Digital Serial Interface (DSI) connector' } # D3DKMDT_VOT_LVDS
8 { return 'D-Jpn connector' } # D3DKMDT_VOT_D_JPN
9 { return 'SDI connector' } # D3DKMDT_VOT_SDI
10 { return 'External display port' } # D3DKMDT_VOT_DISPLAYPORT_EXTERNAL
11 { return 'Embedded display port' } # D3DKMDT_VOT_DISPLAYPORT_EMBEDDED
12 { return 'External Unified Display Interface (UDI)' } # D3DKMDT_VOT_UDI_EXTERNAL
13 { return 'Embedded Unified Display Interface (UDI)' } # D3DKMDT_VOT_UDI_EMBEDDED
14 { return 'Dongle cable that supports SDTV connector' } # D3DKMDT_VOT_SDTVDONGLE
15 { return 'Miracast connected session' } # D3DKMDT_VOT_MIRACAST
0x80000000 { return 'Internally display device (the internal connection in a laptop computer)' } # D3DKMDT_VOT_INTERNAL
default { return 'Unknown connector' }
}
}