我目前正在尝试做一个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
}
}
这样,您可以保留格式。