2015-11-11 5 views
1

J'essaie de créer un objet personnalisé basé sur les noms de serveur à partir d'un fichier texte. Le script que j'ai va et importe le fichier txt dans une variable. Ensuite, exécute un serveur foreach dans la variable servers pour créer l'objet personnalisé. J'aimerais pouvoir afficher les propriétés de l'objet sous la forme d'une table qui n'inclut pas les informations d'en-tête à chaque fois.Powershell Objet personnalisé - ne pas passer pour chaque variable

Voir scénario et sortie ci-dessous:

$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 

} 

Ceci est la sortie actuellement:

Computername RebootDay


SERVER007 dimanche

Computername RebootDay


SERVER009 dimanche

Computername RebootDay


SERVER003 dimanche


Je voudrais qu'il ressemble davantage:

Computername RebootDay


SERVER007 dimanche
SERVER001 dimanche
SERVER009 dimanche

Répondre

1

Ne placez pas la commande "ft" (Format-Table) dans la boucle, le mettre à l'extérieur, une fois, à la fin. par exemple.

$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 

Édition: Correction d'un bug du pipeline foreach.

Vous pourriez peut-être le gérer un peu parce que vous n'avez pas besoin de créer un nouveau PSObject pour une hashtable, et ensuite mettre l'objet dans le pipeline; Vous n'avez pas besoin de répéter les commandes Get-QADComputer trois fois. Je suis suspect que la ligne $obj.combined ne fasse rien - comment pouvez-vous vous référer à un objet dans les propriétés de l'appel new-object, avant que ce nom ne lui soit attribué? Et le splits répété pourrait probablement être combiné parce qu'il fonctionne sur des caractères individuels, pas des chaînes.

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 
+3

Vous ne pouvez pas sortie de la conduite d'une boucle 'ForEach' à quoi que ce soit (à ne pas confondre avec la boucle en ligne 'ForEach-Object' qui peut être raccourcie en' ForEach'). Au lieu de faire quelque chose comme '$ Results = ForEach ($ srv dans $ SERVERS) { TheMadTechnician

+0

@themadtechnician Pouvez-vous répondre directement à ma question? Cela a fonctionné !!! – eMpy

2

TessellatingHeckler était vraiment sur la bonne voie. Le problème avec son code est que vous ne pouvez pas canaliser une boucle ForEach($x in $y){} à quoi que ce soit (à ne pas confondre avec une boucle ForEach-Object que vous voyez généralement raccourcie à ForEach comme $Servers | ForEach{<code here>}) Vous ne voulez pas diriger d'objets vers Format-Table temps, vous voulez y attacher une collection d'objets pour qu'elle soit belle.Voici donc le code modifié:

$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 

qui recueille les objets dans un tableau, vous passez tout le tableau à Format-Table