Lorsque je travaille dans la console interactive, si je définis un nouvel objet et que je lui assigne des valeurs de propriété comme ceci:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Ensuite, lorsque je tape le nom de ma variable dans la fenêtre interactive, Powershell me donne un résumé des propriétés et des valeurs de l'objet:
PS C:\demo> $obj
SomeProperty
------------
Test
Je veux essentiellement faire cela, mais à partir d'une fonction dans un script. La fonction crée un objet et définit certaines valeurs de propriété et je veux qu'elle imprime un résumé des valeurs d'objet dans la fenêtre Powershell avant de revenir. J'ai essayé d'utiliser Write-Host dans la fonction:
Write-Host $obj
Mais cela affiche simplement le type de l'objet et non le résumé:
System.Object
Comment puis-je faire en sorte que ma fonction affiche un résumé des valeurs de propriété de l'objet dans la fenêtre Powershell?
la source
-Force
paramètre pour le faire fonctionner, par exempleWrite-Host ($obj | Format-List -Force | Out-String)
...
. J'ai une haine d'amour avec POSH$objs = @();
et$objs = $objs + $obj;
je peux utiliserConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Property Name, DataType, Default, Identity, InPrimaryKey, IsForeignKey, Description;Ma solution à ce problème était d'utiliser le bloc de sous-expression $ () .
Donne:
la source
Pour imprimer les propriétés et les valeurs d'un objet dans Powershell. Les exemples ci-dessous fonctionnent bien pour moi.
$ pool = Get-Item "IIS: \ AppPools.NET v4.5"
$ pool | Get-Member
$ pool | Select-Object -Property * # Vous pouvez omettre -Property
la source
$x | select *
, idéale pour l'interactivité.Astuce n ° 1
Astuce n ° 12
-Don Jones: Maître PowerShell
Idéalement, votre script créerait vos objets (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
) puis ferait simplement unWrite-Output $objects
. Vous dirigeriez la sortie versFormat-Table
.Ils devraient vraiment appeler PowerShell PowerObjectandPipingShell.
la source
Never use Write-Host.
déclaration. Vous ne pouvez pas utiliser Write-Output à l'intérieur des fonctions qui renvoient des données, car cela "polluera" cette fonction. Exemple simple. Devinez quelle fonction ReturnText sortira? C'est pourquoi j'utilise toujours les fonctions Write-host à l'intérieur. function ReturnText () {Write-Output "Some random message" return "What I want to return"}Quelques remarques générales.
$obj | Select-Object
⊆$obj | Select-Object -Property *
Ce dernier affichera toutes les propriétés non intrinsèques et non générées par le compilateur. Le premier ne pas semble (toujours) montrer tous les types de propriété (dans mes tests, il ne semble montrer la
CodeProperty
MemberType
constante bien - aucune garantie ici).Quelques commutateurs à connaître pour Get-Member
Get-Member
n'obtient pas de membres statiques par défaut. Vous ne pouvez pas non plus (directement) les obtenir avec les membres non statiques. Autrement dit, l'utilisation du commutateur entraîne uniquement le retour des membres statiques:Utilisez le
-Force
.Utilisation
ConvertTo-Json
pour une "sérialisation" détaillée et lisibleJe ne recommande pas nécessairement d'enregistrer des objets en utilisant JSON (à utiliser à la
Export-Clixml
place). Cependant, vous pouvez obtenir une sortie plus ou moins lisible deConvertTo-Json
, ce qui vous permet également de spécifier la profondeur.Notez que ne pas spécifier
Depth
implique-Depth 2
Et si vous ne prévoyez pas de le lire, vous pouvez le
-Compress
faire (c'est-à-dire supprimer les espaces)Utilisation
-InputObject
si vous pouvez (et êtes prêt)99,9% du temps lors de l'utilisation de PowerShell: soit les performances n'ont pas d'importance, soit vous ne vous souciez pas des performances. toutefois , il convient de noter qu'éviter le tuyau lorsque vous n'en avez pas besoin peut économiser des frais généraux et ajouter de la vitesse (la tuyauterie, en général, n'est pas super efficace).
Autrement dit, si vous n'avez qu'un seul
$obj
outil pratique pour l'impression (et que vous n'êtes pas trop paresseux comme moi parfois pour taper-InputObject
):Avertissement pour
Get-Member -InputObject
: Si $ obj est une collection (par exempleSystem.Object[]
), vous finissez par obtenir des informations sur l'objet de collection lui-même:Si vous voulez
Get-Member
pour chacunTypeName
dans la collection (NB pour chacunTypeName
, pas pour chaque objet - une collection de N objets avec tous les mêmesTypeName
n'imprimera qu'une table pour celaTypeName
, pas N tables pour chaque objet) ...... il suffit de le coller directement.la source
Le ci-dessous a vraiment bien fonctionné pour moi. J'ai corrigé toutes les réponses ci-dessus et j'ai lu sur l'affichage des propriétés des objets dans le lien suivant et j'ai trouvé la brève lecture ci-dessous sur l'impression d'objets
ajoutez le texte suivant à un fichier nommé print_object.ps1:
ouvrez l'invite de commande PowerShell, accédez au répertoire dans lequel ce fichier existe et tapez ce qui suit:
Remplacez simplement «System.DateTime» par l'objet que vous vouliez imprimer. Si l'objet est nul, rien ne s'imprimera.
la source
la source