需要帮助从PowerShell创build报告

我有一个计算机名称列表,我需要他们的OU的报告,他们的mangedby属性和他们的名字。 我已经创build了一个与我想要的每个设置的堆栈,但他们没有排队。 对于650台计算机,managedby和OU堆栈的count属性是650,但是当我将数据输出到txt文件时,我只能从ManagedBy获得603行。 如果将数据组合在一起,这样会很好,但是当我将它添加到txt文件时,空白数据不会改变堆栈。 我的代码如下。 生成堆栈后,我将它们导出到一个txt文件,我有一个macros可以截断我的数据。 任何帮助,将不胜感激。

$stackDN = New-Object System.Collections.Stack $stackMB = New-Object System.Collections.Stack $stackNE = New-Object System.Collections.Stack foreach($computer in $computers){ try{ Get-ADComputer -Identity $computer -Server $domain -Properties * -ErrorAction Stop $object = Get-ADComputer -Identity $computer -Server $domain -Properties * $stackDN.Push($object.DistinguishedName) $mb = $object.ManagedBy $stackMB.Push($object.ManagedBy) $stackMB.push('MB not listed') } catch{ $stackNE.Push($computer) } } $stackDN | Out-File -FilePath H:\dn.txt $stackMB | out-file -FilePath H:\mb.txt $stackNE | out-file -FilePath H:\ne.txt' 

在现有的代码中有很多非常规的Powershell。 我觉得你让自己变得比自己想要的更难。 尤其是,使用.NET Stack对象不是必需的,并且试图将每个列表存储在自己的堆栈中对于组织来说并不是最佳select。

您的代码似乎表明您已经有一个$computersvariables,其中包含您的计算机名称列表。 那么我们从这里开始 你有正确的想法迭代集合,但是我们切换到使用ForEach-Object cmdlet而不是ForEach语句。 将结果通过pipe道传递给其他命令会更好。

 $adComputers = $computers | ForEach-Object { Get-ADComputer $_ -Properties managedBy } 

在上面的代码中有几件事情正在进行。 $_是您如何引用ForEach-Object循环中的“当前项目”。 我们还明确地向AD managedBy属性,因为它不包含在返回的默认属性中。 我们不指定NameDistingiushedName因为它们在默认输出中。 但是添加它们并不会造成什么伤害(有些人会说为了可读性更好)。

现在我们有自己的计算机对象集合,让我们做一个报告。 对于这样的数据,主要是一组行和列,CSV输出通常是要走的路。 我们只需要从每个对象中select我们想要的特定属性,然后调用Export-Csv

 $adComputers | Select Name,ManagedBy,DistinguishedName | Export-Csv .\report.csv -NoTypeInformation 

您可以省略Export-Csv调用来预览CSV中的内容。 但是DN字段可能会被截断,除非你使用了一个非常宽的窗口。 我还包括-NoTypeInformation因为它留下了一个标题行,大多数人查看报告不会关心。

从技术上讲,你甚至不需要分割这些命令。 它可以是这样一个大的一行。

 $computers | %{ Get-ADComputer $_ -Prop managedBy } | Select Name,ManagedBy,DistinguishedName | Export-Csv .\report.csv -NoTypeInformation 

请注意,我将ForEach-Object切换为简写别名% ,这在命令行上input要快得多。 我也缩短了-Prop ,这对Powershell来说是非常不明确的,以便知道你的意思。