Changer l'ordre des colonnes dans l'objet
Comment puis-je changer la colonne de commande de la sortie de mon code produit:
$apps = Import-CSV apps.csv
$computers = Import-CSV compobj.csv
foreach ($computer in $computers) {
$computerLob = $computer.lob
$lobApps = $apps | ? {$_.lob -eq $computerLob }
foreach ($app in $lobApps) {
$computerHostname = $computer.hostname
$appLocation = $app.location
$installed=Test-Path "\$computerHostname$appLocation"
New-Object PSObject -Property @{
Computer=$computer.hostname
App=$app.appname
Installed=$installed
}
}
Actuellement en produisant les colonnes dans l'ordre suivant: Installed,App,Computer
.
J'aimerais l'avoir dans l'ordre suivant: Computer,App,Installed
.
BTW, il vous manque une accolade fermante. Je suis en supposant que vous avez l'intention d'avoir imbriqué foreach boucles, et du manque d'attache est à la fin?
Voir ma réponse en de votre autre question. Les réponses fournies ici sont de bonne juste une autre façon de faire.
Voir ma réponse en de votre autre question. Les réponses fournies ici sont de bonne juste une autre façon de faire.
OriginalL'auteur theshizy | 2013-10-27
Vous devez vous connecter pour publier un commentaire.
Si vous voulez vous assurer que la sortie d'un objet se produit dans un certain ordre c'est à dire formaté d'une certaine manière, puis utiliser PowerShell de commandes de mise en forme.
Ce qui est plus, vous pouvez mieux contrôler la sortie par exemple:
Ou de contrôle de la largeur de champ & alignement:
Franchement, je pense qu'il est préférable d'utiliser les commandes de mise en forme pour obtenir l'ordre de sortie que vous voulez plutôt que de se baser sur l'ordre dans lequel les propriétés sont créés.
C'est OK pour la sortie de l'hôte, mais ne fonctionne pas pour l'exportation vers un fichier, car il corrompt l'objet dans le pipeline. Voir la réponse de @Emiliano Poggi.
Vous pouvez prendre la sortie de Format-Table, la pipe à l'extérieur de la Chaîne, puis la pipe que pour mettre du Contenu. Une chose que je fais souvent c'est ceci: $array | Format-Table | Chaîne | Tee-Objet -Variable $table_data | Write-Host {newline} $table_data | Set-Content outputfile $
OriginalL'auteur Keith Hill
Powershell V3 ajout d'un type d'accélérateur pour [PSCustomObject] qui crée des objets à l'aide d'un ordre de la table de hachage, de sorte que les propriétés de rester dans l'ordre de déclaration:
Je ne me souviens plus où j'ai lu à ce sujet. Il n'était pas apparent dans le MS docs qui ont été publiés avec la V3. Ils ont également ajouté un type accelereater [ordonné] pour la création d'commandé des tables de hachage, mais vous n'avez pas à l'utiliser avec [PSCustomObject], il le fait automatiquement.
Bon à savoir - je suis tout à fait nouveau pour V3. Merci d'avoir répondu.
Un autre +1...je l'ai juste essayé, il fonctionne très bien. Rend les choses nettement plus compact que dans la v2, si vous avez beaucoup de propriétés et l'ordre des questions.
En retard à la fête, mais pour ceux qui s'interrogent sur Powershell Accélérateurs, oui, vous pouvez énumérer les accélérateurs disponibles en utilisant
[psobject].Assembly.GetType("System.Management.Automation.TypeAccelerators")::get
Merci à cet articleOriginalL'auteur mjolinor
Le problème, c'est que vous êtes en train d'ajouter des propriétés à l'aide d'une table de hachage, et les tables de hashage de ne pas maintenir l'ordre. Vous pouvez faire une des deux choses:
1. Ajouter les propriétés de manière à définir l'ordre (la dernière ligne est à la sortie de l'objet pour le pipeline):
2. Déterminer l'ordre au moment de la sortie de l'objet de la canalisation à l'aide de Select-Object:
Dont l'une est préférable dépend de la façon dont beaucoup vous allez travailler avec l'objet. Si, comme votre question implique, vous êtes seulement en utilisant le PSObject afin d'afficher les informations sous forme de tableau, la deuxième méthode est plus rapide. Si vous allez à la sortie de l'objet à plusieurs reprises dans différentes parties du script, la première méthode permet simplement de sortie comme
$obj
plutôt que d'avoir à pipe à sélectionnez à chaque fois.Également de noter que la deuxième méthode peut être divisé comme cela si vous ne voulez pas de sortie de l'objet immédiatement après le remplissage:
Select-Object
est overkill pour la mise en forme de la sortie. Pour cela, il est préférable d'utiliser le "commandes de mise en forme" c'est à dire le Format de Table dans ce cas. Dans ce scénario, Sélectionnez-Objet crée un tout nouveaupscustomobject
ce qui est inutile si le but est simplement de mettre en forme la sortie.C'est la raison que j'ai utilisé Select-Object plutôt que Format-Table - parce que je ne voulais pas supposer que commandent les colonnes implique que la seule utilisation de la fonction est d'afficher les données et la sortie n'aurait pas besoin d'être canalisée vers quoi que ce soit. Je pense qu'il est préférable d'écrire des fonctions permettant d'extraire un ensemble unique de données à objets de sortie de la canalisation, les rendant plus souples et repurposable, et l'utilisation de ft si vous avez besoin d'autres fonctionnalités de mise en forme ou si vous êtes certain que le code ne pourront jamais être utilisé pour afficher le résultat final.
OriginalL'auteur Adi Inbar
Format-Table
c'est une bonne solution lorsque vous avez besoin pour afficher vos champs d'objet dans un ordre spécifique, mais il va changer la obect et vous ne serez pas en mesure de tuyau de votre objet, par exemple lors de l'exportation au format csv (Export-Csv
).Dans le cas où vous voulez simplement changer "l'ordre des champs dans l'objet" utilisation
Select-Object
. Cela permettra de préserver type d'objet et les champs, et encore, vous serez en mesure de transférer l'objet à d'autres applets de commande.OriginalL'auteur Emiliano Poggi