Powershell自定义对象 - 不传递foreach变量

时间:2015-11-11 19:12:35

标签: loops powershell hashtable pscustomobject formattable

我正在尝试根据文本文件中的服务器名称创建自定义对象。 我的脚本去了并将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

}

这是目前的输出:

Computername RebootDay

SERVER007星期日

Computername RebootDay

SERVER009星期日

Computername RebootDay

SERVER003星期日

我希望它看起来更像:

Computername RebootDay

SERVER007周日
SERVER001周日
SERVER009周日

2 个答案:

答案 0 :(得分:2)

TessellatingHeckler真的走在正确的轨道上。他的代码存在的问题是,您无法将ForEach($x in $y){}循环传播给任何内容(不要与ForEach-Object循环相混淆,而ForEach循环通常会缩短为仅$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

收集数组中的对象,然后将整个数组传递给{{1}}

答案 1 :(得分:1)

不要将“ft”(格式表)命令放在循环中,将其放在外面,一次放在最后。 e.g。

$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命令。我怀疑$obj.combined行没有做任何事情 - 在分配该名称之前,如何引用新对象调用属性中的对象?并且重复的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