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