[PowerShell] Steuerung der Ausgabe

Yuuri

Fleet Admiral
Registriert
Okt. 2010
Beiträge
13.923
Hallo zusammen,

ich weiß nicht wirklich mit was ich die Suchmaschine füttern soll bzw. brachten mich meine Anfragen gestern nicht zum Ziel, deswegen nun der Thread.

Und zwar frage ich mich, wie ich die Steuerung der Ausgabe regeln kann und welche Properties im Output angezeigt werden (oder auch wie ich den Tabellenkopf formatieren kann).

Bspw. der Output von Get-Disk:
Code:
PS C:\Users\claW> get-disk 0 | table -AutoSize; get-disk 0 | gm | sort Name

Number Friendly Name         OperationalStatus Total Size Partition Style
------ -------------         ----------------- ---------- ---------------
0      WDC WD2003FYYS-02W0B1 Online               1.82 TB MBR




   TypeName: Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_Disk

Name                      MemberType     Definition
----                      ----------     ----------
AllocatedSize             Property       uint64 AllocatedSize {get;}
BootFromDisk              Property       bool BootFromDisk {get;}
BusType                   ScriptProperty System.Object BusType {get=switch ($this.psBase.CimInstanceProperties["BusType"].Value)...
Clone                     Method         System.Object ICloneable.Clone()
Dispose                   Method         void Dispose(), void IDisposable.Dispose()
Equals                    Method         bool Equals(System.Object obj)
FirmwareVersion           Property       string FirmwareVersion {get;}
FriendlyName              Property       string FriendlyName {get;}
GetCimSessionComputerName Method         string GetCimSessionComputerName()
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()
GetHashCode               Method         int GetHashCode()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext co...
GetType                   Method         type GetType()
Guid                      Property       string Guid {get;}
HealthStatus              ScriptProperty System.Object HealthStatus {get=switch ($this.psBase.CimInstanceProperties["HealthStatus"].Value)...
IsBoot                    Property       bool IsBoot {get;}
IsClustered               Property       bool IsClustered {get;}
IsOffline                 Property       bool IsOffline {get;}
IsReadOnly                Property       bool IsReadOnly {get;}
IsSystem                  Property       bool IsSystem {get;}
LargestFreeExtent         Property       uint64 LargestFreeExtent {get;}
Location                  Property       string Location {get;}
LogicalSectorSize         Property       uint32 LogicalSectorSize {get;}
Manufacturer              Property       string Manufacturer {get;}
Model                     Property       string Model {get;}
Number                    Property       uint32 Number {get;}
NumberOfPartitions        Property       uint32 NumberOfPartitions {get;}
ObjectId                  Property       string ObjectId {get;}
OfflineReason             ScriptProperty System.Object OfflineReason {get=switch ($this.psBase.CimInstanceProperties["OfflineReason"].Value)...
OperationalStatus         ScriptProperty System.Object OperationalStatus {get=switch ($this.psBase.CimInstanceProperties["OperationalStatus"].Value)...
PartitionStyle            ScriptProperty System.Object PartitionStyle {get=switch ($this.psBase.CimInstanceProperties["PartitionStyle"].Value)...
Path                      Property       string Path {get;}
PhysicalSectorSize        Property       uint32 PhysicalSectorSize {get;}
ProvisioningType          ScriptProperty System.Object ProvisioningType {get=switch ($this.psBase.CimInstanceProperties["ProvisioningType"].Value)...
PSComputerName            Property       string PSComputerName {get;}
SerialNumber              Property       string SerialNumber {get;}
Signature                 Property       uint32 Signature {get;}
Size                      Property       uint64 Size {get;}
ToString                  Method         string ToString()
UniqueId                  Property       string UniqueId {get;}
UniqueIdFormat            ScriptProperty System.Object UniqueIdFormat {get=switch ($this.psBase.CimInstanceProperties["UniqueIdFormat"].Value)...
Wo kommt hierbei die Property "Total Size" in der Tabelle her? Als Property selbst im Objekt ist es nicht vorhanden. Per Write-Host kann die Ausgabe nicht stattgefunden haben, sonst stünde das Rückgabeobjekt ja im Output mit drin. Irgend jemand Erfahrung darin oder hat wer einen Tipp parat?


LG
 
Schau dir am besten mal die Referenz zu Format-Table an.

Zum Bestimmen was angezeigt wird, kannst du -Property nutzen.
Du kannst auch Expressions übergeben, die dir die Properties deines Input Objekts beliebig formatieren, z.B. sowas:
Code:
get-process notepad | format-table -property ProcessName, @{Label="TotalRunningTime"; Expression={(get-date) - $_.StartTime}}

So kommt auch dein Total Size zustande.

Btw. das könnte dich auch interessieren: Windows PowerShell Tip of the Week: Creating Custom Tables
 
Damit komm ich aber leider nicht mehr an die Rückgabe.
Code:
PS C:\Users\claW> Get-Process explorer

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1851     104    83568     142396   762   517,02   3860 explorer


PS C:\Users\claW> (Get-Process explorer).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Process                                  System.ComponentModel.Component


PS C:\Users\claW> Get-Process explorer | Format-Table -Property ProcessName,@{Label="Total Running Time"; Expression={(get-date) - $_.StartTime}}

ProcessName                                                                                                                      Total Running Time
-----------                                                                                                                      ------------------
explorer                                                                                                                         17:07:57.9566289


PS C:\Users\claW> (Get-Process explorer | Format-Table -Property ProcessName,@{Label="Total Running Time"; Expression={(get-date) - $_.StartTime}}).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array
 
Dein Problem ist, dass Format-Table ein System.Array ausspuckt, du aber lieber das System.ComponentModel.Component-Objekt hättest, dass du Format-Table als Input gegeben hast?

Es sieht für mich so aus, als willst du ein Script schreiben, das ein Objekt zurückgibt und gleichzeitig bestimmen, wie dieses Objekt bei der Ausgabe formatiert wird.
Ein Objekt kann aber nicht selbst bestimmen, wie es formatiert werden soll. Du könntest höchstens einen Custom-Typ definieren und ToString() überschreiben, allerdings beeinflusst das nicht wie Format-Table das Objekt behandelt (also wie das default-Ausgabeformat aussieht).

Du kannst allerdings für beliebige Typen eigene (Table-)Views definieren, die dann von Format-Table angewendet werden.
Das ganze funktioniert per .Format.ps1xml-Files.

Schau dir mal das an: Creating a Table View
 
@Yuuri
Get-Disk gibt immer Totalsize und auch den Partition Style zurück, unabhängig davon wie Du formatierst. Denn das sind ja Eigenschaften des Laufwerks.
 
@ areiland: Ja ich weiß, aber es gibt keine Property mit dem Namen "Total Size".
Code:
PS C:\Users\claW> get-disk

Number Friendly Name                            OperationalStatus Total Size Partition Style
------ -------------                            ----------------- ---------- ---------------
10     Generic STORAGE DEVICE USB Device        No Media                 0 B RAW
4      WDC WD2003FYYS-02W0B0                    Online               1.82 TB MBR
12     Generic STORAGE DEVICE USB Device        No Media                 0 B RAW
9      Generic STORAGE DEVICE USB Device        No Media                 0 B RAW
5      Samsung SSD 840 PRO Series               Online             238.47 GB GPT
6      WDC WD4000FYYZ-01UL1B0                   Online               3.64 TB GPT
2      WDC WD1002FBYS-02A6B0                    Online             931.51 GB MBR
8      WDC WD40 00FYYZ-01UL1B0 SCSI Disk Device Online               3.64 TB GPT
0      WDC WD2003FYYS-02W0B1                    Online               1.82 TB MBR
11     Generic STORAGE DEVICE USB Device        No Media                 0 B RAW
7      WDC WD40 00FYYZ-01UL1B1 SCSI Disk Device Online               3.64 TB GPT
3      WDC WD1002FBYS-02A6B0                    Online             931.51 GB MBR
13     Generic STORAGE DEVICE USB Device        No Media                 0 B RAW
1      WDC WD2003FYYS-02W0B0                    Online               1.82 TB MBR


PS C:\Users\claW> get-disk | gm | sort name


   TypeName: Microsoft.Management.Infrastructure.CimInstance#ROOT/Microsoft/Windows/Storage/MSFT_Disk

Name                      MemberType     Definition
----                      ----------     ----------
AllocatedSize             Property       uint64 AllocatedSize {get;}
BootFromDisk              Property       bool BootFromDisk {get;}
BusType                   ScriptProperty System.Object BusType {get=switch ($this.psBase.CimInstanceProperties["BusType"].Value)...
Clone                     Method         System.Object ICloneable.Clone()
Dispose                   Method         void Dispose(), void IDisposable.Dispose()
Equals                    Method         bool Equals(System.Object obj)
FirmwareVersion           Property       string FirmwareVersion {get;}
FriendlyName              Property       string FriendlyName {get;}
GetCimSessionComputerName Method         string GetCimSessionComputerName()
GetCimSessionInstanceId   Method         guid GetCimSessionInstanceId()
GetHashCode               Method         int GetHashCode()
GetObjectData             Method         void GetObjectData(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context), void ISerializable.GetObjectData(System.Runtime.Serialization.SerializationInfo info... GetType                   Method         type GetType()
Guid                      Property       string Guid {get;}
HealthStatus              ScriptProperty System.Object HealthStatus {get=switch ($this.psBase.CimInstanceProperties["HealthStatus"].Value)...
IsBoot                    Property       bool IsBoot {get;}
IsClustered               Property       bool IsClustered {get;}
IsOffline                 Property       bool IsOffline {get;}
IsReadOnly                Property       bool IsReadOnly {get;}
IsSystem                  Property       bool IsSystem {get;}
LargestFreeExtent         Property       uint64 LargestFreeExtent {get;}
Location                  Property       string Location {get;}
LogicalSectorSize         Property       uint32 LogicalSectorSize {get;}
Manufacturer              Property       string Manufacturer {get;}
Model                     Property       string Model {get;}
Number                    Property       uint32 Number {get;}
NumberOfPartitions        Property       uint32 NumberOfPartitions {get;}
ObjectId                  Property       string ObjectId {get;}
OfflineReason             ScriptProperty System.Object OfflineReason {get=switch ($this.psBase.CimInstanceProperties["OfflineReason"].Value)...
OperationalStatus         ScriptProperty System.Object OperationalStatus {get=switch ($this.psBase.CimInstanceProperties["OperationalStatus"].Value)...
PartitionStyle            ScriptProperty System.Object PartitionStyle {get=switch ($this.psBase.CimInstanceProperties["PartitionStyle"].Value)...
Path                      Property       string Path {get;}
PhysicalSectorSize        Property       uint32 PhysicalSectorSize {get;}
ProvisioningType          ScriptProperty System.Object ProvisioningType {get=switch ($this.psBase.CimInstanceProperties["ProvisioningType"].Value)...
PSComputerName            Property       string PSComputerName {get;}
SerialNumber              Property       string SerialNumber {get;}
Signature                 Property       uint32 Signature {get;}
Size                      Property       uint64 Size {get;}
ToString                  Method         string ToString()
UniqueId                  Property       string UniqueId {get;}
UniqueIdFormat            ScriptProperty System.Object UniqueIdFormat {get=switch ($this.psBase.CimInstanceProperties["UniqueIdFormat"].Value)...
Es gibt Size, aber nicht "Total Size". "Friendly Name" hört auf die Property FriendlyName und "Partition Style" hört ebenso auf die Property PartitionStyle. Ergo muss ich ja irgendwo definieren können, was an Properties und wie in der Tabelle angezeigt wird. Denke da ist das von Grantig angesprochene Table View genau das Richtige.

@ Grantig: Danke, das sieht vielversprechend aus beim Drüberfliegen. Werd ich mir ansehen.
Ergänzung ()

Wunderbar, das System funktioniert damit perfekt.
Code:
PS C:\Users\claW> Reload-claW; Check-HddHealth; (Check-HddHealth)[0] | gm | table -AutoSize

Partitions Model                                Size       Power on hours  Read / Write errors    Health status
---------- -----                                ----       --------------  -------------------    -------------
         C Samsung SSD 840 PRO Series      238,47 GB         438.16:00:00                0 / 0          Healthy
         D WDC WD1002FBYS-02A6B0           931,51 GB        1300.07:00:00                0 / 0          Healthy
         E WDC WD1002FBYS-02A6B0           931,51 GB        1163.12:00:00                0 / 0          Healthy
         F WDC WD2003FYYS-02W0B0             1,82 TB        1074.21:00:00                0 / 0          Healthy
         G WDC WD2003FYYS-02W0B0             1,82 TB         937.06:00:00                0 / 0          Healthy
         H WDC WD2003FYYS-02W0B1             1,82 TB         569.14:00:00                0 / 0          Healthy
         I WDC WD4000FYYZ-01UL1B0            3,64 TB         448.19:00:00                0 / 0          Healthy
         J WDC WD4000FYYZ-01UL1B0            3,64 TB         298.10:00:00                0 / 0          Healthy
         K WDC WD4000FYYZ-01UL1B1            3,64 TB         198.19:00:00                0 / 0          Healthy




   TypeName: claW.HddHealthItem

Name            MemberType   Definition
----            ----------   ----------
Equals          Method       bool Equals(System.Object obj)
GetHashCode     Method       int GetHashCode()
GetType         Method       type GetType()
ToString        Method       string ToString()
Firmware        NoteProperty System.String Firmware=DXM05B0Q
Health          NoteProperty System.String Health=Healthy
Manufacturer    NoteProperty System.String Manufacturer=
Model           NoteProperty System.String Model=Samsung SSD 840 PRO Series
Partitions      NoteProperty System.String Partitions=C
PowerOnHours    NoteProperty System.UInt32 PowerOnHours=10528
ReadErrorCount  NoteProperty System.Int32 ReadErrorCount=0
SerialNumber    NoteProperty System.String SerialNumber=
Size            NoteProperty System.UInt64 Size=256060514304
WriteErrorCount NoteProperty System.Int32 WriteErrorCount=0
Vor allem auch komplett aus PowerShell heraus und mit Custom Objects (über $x.PSObject.TypeNames kann man nen eigenen Typ zuweisen und der greift dann in der Format-XML).

Danke!
 
Zurück
Oben