Powershell:提取部分值并以新格式输出

时间:2018-07-12 21:16:49

标签: powershell

我目前正在研究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'

非常感谢您的答复。

2 个答案:

答案 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' }
    }
}