Wie erzwinge ich die Ausgabe in „Format-Tabelle“ für ein benutzerdefiniertes PSObject, OHNE eine .format.ps1xml-Datei zu verwenden?

Wie erzwinge ich die Ausgabe in „Format-Tabelle“ für ein benutzerdefiniertes PSObject, OHNE eine .format.ps1xml-Datei zu verwenden?

Ich weiß, dass ich die Formatierung für mich definieren kann, indem ich eine Datei MyCustomPSObjecterstelle und lade .MyCustomPSObject.format.ps1xml

Und ich habe gesehenDie Benutzer führen diese Formatdateigenerierung spontan innerhalb der PS1-Skriptdatei durch.(Auch hier beginnendAuflistung unter dem Satz„Also habe ich eine erweiterte PowerShell-Funktion namens Get-ProcessTotal geschrieben“ab Zeile 145.)

Und soweit ich weiß,Der erste Eintrag in dieser Formatierungsdatei wird als Standard verwendet.

Das Generieren dieser externen Datei erscheint mir umständlich.

Frage:

  • Gibt es eine Möglichkeit, dies zu tun, OHNE diese externe Datei zu generieren und zu laden?

Alles was ich will ist"Als Tabelle ausgeben". (Im Grunde wird es durchlaufen, Format-Tableohne dass dabei die Objekthaftigkeit verloren geht.)

Verwandte Fragen

Skript „Get-VSSWriters.Current-Version.ps1“

Dies ist das fragliche Skript:

# 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

Tatsächliche Leistung

PS C:\> .\Get-VSSWriters.Current-Version.ps1 | select -first 1
WriterEnum : 1
WriterName : Task Scheduler Writer
StateID    : 1
StateDesc  : Stable
LastError  : No error

Gewünschte Ausgabe

PS C:\> .\Get-VSSWriters.Updated-Version.ps1 | select -first 1
WriterEnum WriterName            StateID StateDesc LastError
---------- ----------            ------- --------- ---------
         1 Task Scheduler Writer 1       Stable    No error

(Was dasselbe sein sollte wie .\Get-VSSWriters.Current-Version.ps1 | select -first 1 | Format-Table.)

verwandte Informationen