从 Powershell 结果中删除 @{ColumnName

Remove @{ColumnName from Powershell results

我对 PowerShell 脚本编写还比较陌生,主要是通过谷歌搜索我正在尝试做的事情,将不同的脚本和 cmdlet 拼凑在一起。由于特殊字符,我无法 Google 或在 StackExchange 上搜索的一个问题是我的所有结果都以 @{ColumnName=ColumnData} 形式出现。

这是我在某个地方找到的一个示例脚本,用于拉取 AD 组的所有成员。

$Groups = Get-ADGroup -Filter {Name -like "!GroupName"}
$path = $groups
$myCol = @()
ForEach ($Group in $Groups)
{
    $Members = @(Get-ADGroupMember "$Group")
    ForEach ($Member in $Members){
       try{
        $user = get-aduser -identity $member -properties displayname
        $MyObject = New-Object PSObject -Property @{
        Displayname = $user.Displayname
       }        
        $mycol += $MyObject}
catch {}}
    }
Write-Host $MyCol | FL

我很确定有更好的方法来获取 AD 组的成员,但这不是目前的问题。问题是所有数据都像@{Displayname=Lawrence, Kimberly} 一样出现,而我放在一起的许多脚本都会发生这种情况。

关于如何正确编写脚本以便我可以得到 DisplayName = Lawrence, Kimberly 的任何想法?

这实际上与 Active Directory 无关;您正在创建自定义对象,然后直接输出它们,默认情况下,如果您使用 Write-Host(旨在自定义输出),PowerShell 将如何格式化输出。如果您想更具体地了解您的输出应该是什么样子,我们可以提供帮助,但这里有一个仅使用 Write-Output:

将结果输出为字符串列表的示例
$myCol = @()
$MyObject = New-Object PSObject -Property @{ DisplayName = "Lawrence, Kimberly" }
$myCol += $MyObject
$MyObject = New-Object PSObject -Property @{ DisplayName = "Hello, World" }
$myCol += $MyObject

# The default will show at-symbols, etc:  Write-Host $MyCol | FL

Write-Output $myCol

输出将是:

DisplayName                                                                                                                                                           
-----------                                                                                                                                                           
Lawrence, Kimberly                                                                                                                                                    
Hello, World    

试试这个:

Get-ADGroup -Filter "Name -like '!GroupName'" | 
  Get-ADGroupMember | 
  Get-ADUser -Properties DisplayName | 
  Select-Object DisplayName

当我 运行 你的代码时,我也得到了哈希值,即使没有特殊字符。您的代码过于复杂。

我同意您的代码很复杂,但没有必要。有几件重要的事情需要提及 为什么 您的输出看起来是这样的。

您正在创建一个 PSCustomObject 数组,其功能类似于 hash-tables。在你的处理结束时,你有一个 objects 和 属性 DisplayName 的数组。由于您使用 Write-Host 来显示 $myCol 的内容,因此需要将其转换为字符串数组才能显示它。如果您只输入 [string[]]$myCol,您会看到类似的输出。我应该希望你在处理过程中做了其他事情,因为其他答案表明你有一种非常复杂的方式来获得你正在寻找的东西。

在不打败那些其他解决方案的情况下,我会建议对您目前的解决方案进行一些小的修改。你的标题和最后一句话与你正在寻找的内容相矛盾,因为你想删除标题中的 ColumnName 和你正在寻找输出的最后一句话 DisplayName = Name.

更改最后一行将解决这两个问题。如果您只想 displayname 自己

$myCols | Select-Object -ExpandProperty DisplayName

Lawrence, Kimberly

如果你真的想要其他格式,你可以这样做

$myCols | ForEach-Object{
    "DisplayName = $($_.DisplayName)"
}

同样,与其他答案一样,我强调您的代码可以使用简单的大修。如果您需要了解它为何以这种方式工作,我希望我能提供一些帮助。