我目前正在尝试Out-GridView
来简单了解我们的群组政策对象。为此,我使用Get-GPO
cmdlet,如下所示:
Get-GPO -all |
Select-Object -Property DisplayName, Description |
Sort-Object -Property DisplayName |
Out-GridView
在我们公司,我们使用说明字段的第一行来存储创建策略的管理员的名称,以下所有行都包含简短描述。
我希望能够使用列标题Description
以及该字段的所有其他行在单独的列中抓取Responsability
字段的第一行。所以假设我当前的代码会给我一个这样的表:
DisplayName | Description
-------------------------
GPO1 | Username
| stuff
| stuff
我希望它看起来像这样:
DisplayName | Responsability | Description
------------------------------------------
GPO1 | Username | stuff
| | stuff
我怎样才能做到这一点?
答案 0 :(得分:4)
正如@Matt建议的那样,你可以使用calculated property。
然后,由于Description是一个字符串,而不是一个字符串数组,因此您需要在换行符处拆分该行。这可以通过使用-split
来完成,因为它来自GPO的信息我们可以假设Windows行结尾`r`n(否则你可以使用[environment]::newline
)
第一个属性,使用数组元素[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
答案 1 :(得分:3)
首先要理解的是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
每次在对象上调用属性时,都可以使用ScriptProperty执行脚本块。使用$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
答案 2 :(得分:2)
我可能会使用这样的东西:
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
}
}
这样您就可以保留格式。