> system1.txt "--6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:37:39 30 4
gpt4 key购买 nike

我目前正在研究 Powershell 并正在研究从 Windows 系统获取显示配置的脚本。我得到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: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需要解码,即 '10 = Displayport External'根据网址: https://technet.microsoft.com/en-us/ff546605(v=vs.89)

如何根据 URL 解码值并使结果仅显示为 'Displayport External'在输出txt?

非常感谢您的回复。

最佳答案

问题一 :
LotPings在评论中有效地提供了解决方案(PSv3+):

[system.windows.forms.screen]::AllScreens.Bounds |
Format-List Width, Height >> system1.txt
  • .Bounds直接应用于 ::AllScreens 返回的数组,在这种情况下,数组元素的数组分别为 .Bounds可以方便地返回属性值,这是一个名为 member-access enumeration 的 PSv3+ 功能.
  • Format-List Width, Height然后提取 .Width.Height来自结果 [System.Drawing.Rectangle] 的属性值实例并将它们显示为列表。
  • 注:所有Format-*的目的| cmdlet 将创建仅用于显示的输出,即生成对人类观察者友好但不适合进一步编程处理的输出。

  • 由于您使用的是 Out-File -Append没有其他选项,>>是一个方便的捷径。 (您将获得 UTF16-LE 编码(“Un​​icode”)文件。)

  • 问题2 :
    PowerShell 对 .NET 枚举( [enum] -派生类型)具有很好的内置支持,但在您的情况下 WMI 报告的是简单整数 [System.UInt32] ,因此您必须执行自己的映射。
    在 PSv5+ 中,您可以定义自己的 [enum]但是,在这种情况下,对该类型的简单转换可以帮助您:
    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 .
  • 您正在创建符号常量的静态副本,因此这两组可能会不同步,尽管可能很少添加新常量。
    (我不知道定义这些常量的任何预先存在的 .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

    关于Powershell:提取部分值并以新格式输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51314576/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com