1

我正在尝试根据文本文件中的服务器名称创建自定义对象。我拥有的脚本将 txt 文件导入到变量中。然后在 servers 变量中运行一个 foreach 服务器来创建自定义对象。我希望能够将对象的属性输出为每次不包含标题信息的表。

请参阅下面的脚本和输出:

 $SERVERS = gc c:\servers.txt


foreach ($srv in $SERVERS)
{
    $Obj = New-Object PsObject -Property`
   @{
         Computername = $srv
         SecurityGroup = (Get-QADComputer $srv).memberof
         RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
         Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
         RebootTime = $obj.combined.substring(0,4)
     }

 echo $obj | ft Computername,RebootDay -autosize

}

这是当前的输出:

计算机名重启日


SERVER007 星期日

计算机名重启日


SERVER009 星期日

计算机名重启日


SERVER003 星期日


我希望它看起来更像:

计算机名重启日


SERVER007 星期日
SERVER001 星期日
SERVER009 星期日

4

2 回答 2

3

TessellatingHeckler 确实走在了正确的轨道上。他的代码的问题是你不能将循环传递给任何东西(不要与你通常看到的缩短为likeForEach($x in $y){}的循环混淆)你不想一次将对象传递给一个,你想将一组对象通过管道传递给它,使其看起来不错。所以这里是修改后的代码:ForEach-ObjectForEach$Servers | ForEach{<code here>}Format-Table

$SERVERS = gc c:\servers.txt

$Results = foreach ($srv in $SERVERS)
{
    New-Object PsObject -Property @{
         Computername = $srv
         SecurityGroup = (Get-QADComputer $srv).memberof
         RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
         Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
         RebootTime = $obj.combined.substring(0,4)
     }
}
$Results | FT ComputerName,RebootDay -auto

收集数组中的对象,然后将整个数组传递给Format-Table

于 2015-11-11T19:36:25.823 回答
1

不要将“ft”(格式表)命令放在循环内,将其放在外面,一次,最后。例如

$SERVERS = gc c:\servers.txt

$results = foreach ($srv in $SERVERS)
{
    $Obj = New-Object PsObject -Property`
   @{
         Computername = $srv
         SecurityGroup = (Get-QADComputer $srv).memberof
         RebootDay = ((Get-QADComputer $srv).memberof).split(',').split(' ')[2]
         Combined = ((Get-QADComputer $srv).memberof).split(',').split(' ').split('=')[1]
         RebootTime = $obj.combined.substring(0,4)
     }
    $Obj
} 
$results | ft Computername,RebootDay -autosize

编辑:修复了 foreach 管道错误。

您可能会稍微整理一下,因为您不需要为哈希表创建新的 PSObject,然后将对象放入管道;您无需重复 Get-QADComputer 命令 3 次。我怀疑该$obj.combined行没有做任何事情 - 在分配该名称之前,您如何在 new-object 调用的属性中引用一个对象?重复的splits可能可以组合,因为它对单个字符而不是字符串进行操作。

gc c:\servers.txt | foreach {
    $memberof = (Get-QADComputer $_).memberof

    @{
        Computername = $_;
        SecurityGroup = $memberof;
        RebootDay = $memberof.split(', ')[2];
        Combined = $memberof.split(', =')[1];
        # ?? RebootTime = $obj.combined.substring(0,4)
    }
} | ft Computername,RebootDay -autosize
于 2015-11-11T19:14:51.960 回答