Je sais que je peux définir le formatage de mon MyCustomPSObject
en générant et en chargeant un fichier MyCustomPSObject.format.ps1xml
.
Et j'ai vu des gens faire ce format-fichier-génération à la volée à partir du fichier .ps1-script. (Aussi, commencez-vous à inscrire ci-dessous la phrase "Donc, j'ai écrit une fonction PowerShell avancée appelée Get-ProcessTotal" à partir de la ligne 145. )
Et, d'après ce que je comprends, la première entrée de ce fichier de mise en forme est utilisée par défaut.
La génération de ce fichier externe me semble lourd.
Tout ce que je veux, c'est "Sortez-le en tant que table" . (Fondamentalement l'exécuter à travers Format-Table
mais pas perdre objet-ness dans le processus.)
C'est le script en question:
# This script lists VSS writers. # The original, uncustomized, version was taken from here: # https://gallery.technet.microsoft.com/scriptcenter/Powershell-ScriptFunction-415e9e70 $RawWriters = Invoke-Command -ErrorAction Stop -ScriptBlock { #Requires -RunAsAdministrator return (VssAdmin List Writers) } # We don't really care about "WriterID" and "WriterInstanceID", so we leave them out of the default # display set. (Approach copied from here: # https://learn-powershell.net/2013/08/03/quick-hits-set-the-default-property-display-in-powershell-on-custom-objects/ ) $defaultDisplaySet = 'WriterEnum', 'WriterName', 'StateID', 'StateDesc', 'LastError' $defaultDisplayPropertySet = New-Object System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet', [string[]]$defaultDisplaySet) $PSStandardMembers = [System.Management.Automation.PSMemberInfo[]]@($defaultDisplayPropertySet) $Writers = @() for ($i=0; $i -lt (($RawWriters.Count)-3)/6; $i++) { $Writer = New-Object -TypeName psobject $Writer.PSObject.TypeNames.Insert(0, 'MyVSSWriter') $Writer | Add-Member MemberSet PSStandardMembers $PSStandardMembers $Writer| Add-Member "WriterEnum" ($i + 1) # Note: We split on both single quotes and double quotes. # That way this script will work for both: # * the English language version of Windows (>>Writer name: 'WMI Writer'<<) # * the German version of Windows (>>Verfassername: "WMI Writer"<<) $Writer| Add-Member "WriterName" $RawWriters[($i*6)+3].Split("`"'")[1] $Writer| Add-Member "WriterID" $RawWriters[($i*6)+4].Split('{}')[1] $Writer| Add-Member "WriterInstanceID" $RawWriters[($i*6)+5].Split('{}')[1] $Writer| Add-Member "StateID" $RawWriters[($i*6)+6].Split('[]')[1] $Writer| Add-Member "StateDesc" $RawWriters[($i*6)+6].Split('[]')[2].SubString(1) $Writer| Add-Member "LastError" $RawWriters[($i*6)+7].Split(':')[1].Substring(1) $Writers += $Writer } $Writers
PS C:\> .\Get-VSSWriters.Current-Version.ps1 | select -first 1 WriterEnum : 1 WriterName : Task Scheduler Writer StateID : 1 StateDesc : Stable LastError : No error
PS C:\> .\Get-VSSWriters.Updated-Version.ps1 | select -first 1 WriterEnum WriterName StateID StateDesc LastError ---------- ---------- ------- --------- --------- 1 Task Scheduler Writer 1 Stable No error
(Ce qui devrait être le même que .\Get-VSSWriters.Current-Version.ps1 | select -first 1 | Format-Table
.)
Tee-Object enregistre la sortie de la commande dans un fichier ou une variable et l'envoie également dans le pipeline.
PS D:\PShell> $x = .\SU\Get-VSSWriters.Current-Version_1173588.ps1 PS D:\PShell> $x | select -First 1 | Tee-Object -Variable y | Format-Table -AutoSize -Wrap WriterEnum WriterName StateID StateDesc LastError ---------- ---------- ------- --------- --------- 1 Task Scheduler Writer 1 Stable No error PS D:\PShell> $y.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False PSCustomObject System.Object PS D:\PShell> $y WriterEnum : 1 WriterName : Task Scheduler Writer StateID : 1 StateDesc : Stable LastError : No error PS D:\PShell>