在Powershell中拆分属性值



我目前正在尝试做一个Out-GridView来获取有关我们的组策略对象的简单概述。为此,我正在使用 Get-GPO cmdlet,如下所示:

Get-GPO -all |
    Select-Object -Property DisplayName, Description |
    Sort-Object -Property DisplayName |
    Out-GridView

在我们公司中,我们使用描述字段的第一行来存储创建策略的管理员的名称,并且所有后续行都包含简短描述。

我希望能够用列标题Responsability抓取Description字段的第一行,并在单独的列中抓取该字段的所有其他行。因此,假设我当前的代码会给我一个这样的表:

DisplayName | Description
-------------------------
GPO1        | Username
            | stuff
            | stuff

我希望它看起来像这样:

DisplayName | Responsability | Description
------------------------------------------
GPO1        | Username       | stuff
            |                | stuff

我怎样才能做到这一点?

如@Matt建议,可以使用计算属性。

然后,由于 Description 是一个字符串,而不是一个字符串数组,因此您需要在换行符处拆分行。这可以通过使用-split来完成,并且由于它是来自GPO的信息,我们可以假设Windows行结尾为'r'n(否则您可以使用[environment]::newline(

第一个属性,use array element [0]将是第一行。对于第二个属性,我们需要将数组保存在变量中。然后我们可以使用该变量的长度来获取第一个元素到最后一个元素。

Get-GPO -all |
    Select-Object -Property DisplayName, @{
            Name = "Responsibility"
            Expression = {($_.Description -split "`r`n")[0]}
        }, @{
            Name = "Description"
            Expression = {
                $linearray = ($_.Description -split "`r`n")
                $linearray[1..($linearray.length - 1)] | Out-String
            }
        } |
    Sort-Object -Property DisplayName |
    Out-GridView

或者,您可以创建一个新对象,而不是使用计算属性。

Get-GPO -all |
    ForEach-Object {
        $linearray = ($_.Description -split "`r`n")
        [pscustomobject]@{
            "DisplayName" = $_.DisplayName
            "Responsibility"= $linearray[0]
            "Description" = $linearray[1..($linearray.length - 1)] | Out-String
        }
    } |
    Sort-Object -Property DisplayName |
    Out-GridView

首先要了解的是Get-GPO返回的内容:一个对象数组,每个对象都有一组属性。

表中显示的是一系列行(每个对象一个行(,列是该对象的属性值。

因此,如果需要一个新列,则需要一个新属性。

有两种

方法可以执行此操作:使用 Select-Object 创建计算属性或通过 Add-Member 向对象添加属性。

计算

你可以提供一个哈希表作为Select-Object的属性,并且哈希表必须有两个键:

  • Name(属性的名称(
  • Expression(将执行以确定值的脚本块,其中$_引用对象本身(
Get-GPO -all |
Select-Object -Property DisplayName, Description, @{
    Name = 'Responsibility'
    Expression = {
        ($_.Description -split 'r?n')[0] # First line
    }
} |
Sort-Object -Property DisplayName |
Out-GridView

新会员

可以使用每次在对象上调用属性时执行脚本块的脚本属性。使用此上下文中的$this引用对象。

Get-GPO -all |
Add-Member -MemberType ScriptProperty -Name Responsibility -Value {
    ($this.Description -split 'r?n')[0] # First line
} -Force -PassThru |
Select-Object -Property DisplayName, Responsibility, Description |
Sort-Object -Property DisplayName |
Out-GridView

我可能会使用这样的东西:

Get-GPO -All | ForEach-Object {
  $info = $_.Description
  $pos = $info.IndexOf([Environment]::NewLine)
  if ( $pos -gt 0 ) {
    $responsibility = $info.Substring(0,$pos)
    $description    = $info.Substring($pos + [Environment]::NewLine.Length)
  }
  else {
    $responsibility = ""
    $description    = $info
  }
  [PSCustomObject] @{
    "DisplayName"    = $_.DisplayName
    "Responsibility" = $responsibility
    "Description"    = $description
  }
}

这样,您可以保留格式。

最新更新