【问题标题】:how to take only property name and ignore its values in powershell如何在 powershell 中仅采用属性名称并忽略其值
【发布时间】:2018-03-14 20:36:07
【问题描述】:

我有一个属性文件,其中一个属性看起来像这样

tls.default.cipherSuites = TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,\
                           TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\
                           TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,\
                           TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,\
                           TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,\
                           TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,\
                           TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,\
                           TLS_DHE_RSA_WITH_AES_128_CBC_SHA,\
                           TLS_RSA_WITH_AES_128_GCM_SHA256,\
                           TLS_RSA_WITH_AES_128_CBC_SHA256,\
                           TLS_RSA_WITH_AES_128_CBC_SHA,\
                           TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,\
                           TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,\
                           TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,\
                           TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,\
                           TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,\
                           TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,\
                           TLS_EMPTY_RENEGOTIATION_INFO_SCSV

我只想显示属性名称而不是其值。我试过下面的命令

Get-Content -Path "C:\Test\run_pa.properties" |
  Where-Object { ! $_.StartsWith("#") } |
    ? { $_.trim() -ne "" } | ForEach-Object { $_ -replace '=.*' }

但我得到如下输出

tls.default.protocols 
                       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\
                       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,\
                       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,\
                       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,\
                       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,\
                       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,\
                       TLS_DHE_RSA_WITH_AES_128_CBC_SHA,\
                       TLS_RSA_WITH_AES_128_GCM_SHA256,\
                       TLS_RSA_WITH_AES_128_CBC_SHA256,\
                       TLS_RSA_WITH_AES_128_CBC_SHA,\
                       TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,\
                       TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,\
                       TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,\
                       TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,\
                       TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,\
                       TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,\
                       TLS_EMPTY_RENEGOTIATION_INFO_SCSV

如何避免这种情况下的属性值并仅获取属性名称?

【问题讨论】:

    标签: powershell text-parsing


    【解决方案1】:

    下面将这些行过滤到那些不以# 开头并包含= 的行,然后从它们中删除所有以可选空格开头的所有= 之前的内容,只留下属性名称:

    (Get-Content "C:\Test\run_pa.properties") -notmatch '^#' -match '=' -replace '\s*=.*'
    

    【讨论】:

    • 完美运行。早些时候我用我的查询尝试了 Where-Object { $_ -match("=") } 但我没有过滤掉完整的属性名称。
    【解决方案2】:

    使用Get-Content 上的-Raw 选项始终只获得一个string(v4 和v5 之间存在版本差异)而不是每行的数组。然后用= 符号拆分它并使用.Trim(' ') 修剪掉空格:

    $content = Get-Content -Path $path -Raw
    $propertyName = $content .Split('=')[0].Trim(' ')
    

    【讨论】:

    • 您的解决方案适用于单属性示例输入,但实际输入具有 多个 属性(它是一个 properties 文件;示例输入是只是有问题的 one 属性)。
    猜你喜欢
    • 2018-10-15
    • 2019-02-22
    • 2020-10-13
    • 2014-03-21
    • 2012-02-02
    • 2014-05-16
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多