【问题标题】:Powershell Where-Object Subject -Match with split to exclude CN= etc?Powershell Where-Object Subject - 与拆分匹配以排除 CN= 等?
【发布时间】:2022-10-07 21:51:15
【问题描述】:

例如,我如何将我的输出与不想要的“内容”分开

Get-ChildItem Cert:\LocalMachine\CA | Where-Object Subject -Match "Windows"

我的主题看起来像这样

CN=Microsoft Windows 硬件兼容性,OU=Microsoft Corporation,OU=Microsoft Windows 硬件兼容性中间 CA,OU=复制...。

我怎样才能只显示内容而不“CN=”,“欧=”但只有这样,单线:

Microsoft Windows 硬件兼容性 Microsoft Corporation Microsoft Windows 硬件兼容性中间 CA

【问题讨论】:

    标签: powershell split


    【解决方案1】:

    这就是你所追求的吗?

    Clear-Host
    (
        Get-ChildItem -Path 'Cert:LocalMachineCA' | 
        Where-Object Subject -Match 'Windows'
    ).Subject -replace  ',|.[A-Z]='
    # Results
    <#
    Microsoft Windows Hardware Compatibility Microsoft Corporation Microsoft Windows Hardware Compatibility Intermediate CA Copyright (c) 1997 Microsoft 
    Corp.
    #>
    

    【讨论】:

    • 是的,它似乎正如我想要的那样工作。我将把它作为一个变量进行尝试,看看当我在计算机阵列中测试代码时会发生什么,看看会发生什么。但就像一个魅力,谢谢!
    • 不用担心。很高兴它有帮助。您是指“RegEx 替换语句”的“-match”开关的变量吗?您可以将它们放在 var/parameter 中并根据需要传递它们。
    【解决方案2】:

    您正在寻找提取字段价值观来自 DN(专有名称)。

    postanote's answer有些这样做,但是,由于返回一个带有空格作为分隔符的字符串,字段值之间的边界会丢失。

    如果要检索字段值作为大批字符串,使用regex::Matches() .NET 方法;您可以稍后使用-join 将数组转换为带有选择分隔符的单行表示:

    # Outputs the field values as an *array*
    [regex]::Matches(
      (Get-ChildItem Cert:LocalMachineCA | Where-Object Subject -Match Windows).Subject, 
      '(?<==)[^,]+'
    ).Value
    

    一个简化的例子,使用带有自定义分隔符的-join

    [regex]::Matches(
      'CN=common name, OU=org unit 1, OU=org unit 2', 
      '(?<==)[^,]+'
    ).Value -join '|'
    

    逐字输出:

    common name|org unit 1|org unit 2
    

    如果基于分隔符的单行输出是只要目标,您可以简化为单个 -replace 操作(与上面的输出相同):

    (
      'CN=common name, OU=org unit 1, OU=org unit 2' -replace 
        '(?:^|, )[a-z]+=', '|'
    ).Substring(1)
    

    警告:就像postanote的回答一样,这个假定没有字段值包含逃脱,= 字符形式为 ,=.
    需要一个更复杂的正则表达式来解释这一点,例如this answer 中所示。

    【讨论】:

    • ''mklement0',同意,我最初是沿着这条路开始的(仍然使用简单的替换-replace '.[A-Z]=' -replace ',s', '|') 但更改为我提供的内容,特别是 OP 显示为他们想要的输出的内容。
    • 明白了,@postanote。我的目的是指出基于空格作为分隔符的单行表示的局限性,并提供克服这一局限性的解决方案。我看到您之前评论中的解决方案也可以生成一个带有自定义分隔符的单行表示,其中包含特定的 DN(专有名称),它只有两字字段名称。但是,一般而言,并非所有字段名称都如此 - 请参阅the docs
    • @postanote,你可以用('CN=common name, OU=org unit 1, OU=org unit 2' -replace '(?:^|, )[a-z]+=', '|').Substring(1) 之类的东西来克服后一个限制,尽管关于不处理的警告逃脱正确的字符仍然适用。
    • 同意并复制,关于逃生字符的事情。
    猜你喜欢
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 2018-11-30
    • 2017-05-24
    • 2016-01-07
    • 2018-01-05
    相关资源
    最近更新 更多