PowerShell objektumok vizsgálata (Format-Custom, ConvertTo-Json)

Az objektumok részletesebb vizsgálatára felhasználható a format-custom  cmdlet. Ez a bemeneteként kapott objektum tulajdonságait részletesen kiírja, ezen kívül az objektum és tulajdonságainak típusát (osztályát) is megjeleníti:

[1] PS C:\> Get-Service wuauserv | Format-Custom -Property *

 

class ServiceController

{

  Name = wuauserv

  RequiredServices =

    [

      class ServiceController

      {

        Status = Running

        Name = rpcss

        DisplayName = Remote Procedure Call (RPC)

      }

    ]

 

  CanPauseAndContinue = False

  CanShutdown = True

  CanStop = True

  DisplayName = Windows Update

  DependentServices =

    [

    ]

 

  MachineName = .

  ServiceName = wuauserv

  ServicesDependedOn =

    [

      class ServiceController

      {

        Status = Running

        Name = rpcss

        DisplayName = Remote Procedure Call (RPC)

      }

    ]

 

  ServiceHandle =

    class SafeServiceHandle

    {

      IsInvalid = False

      IsClosed = False

    }

  Status = Running

  ServiceType = Win32ShareProcess

  Site =

  Container =

}

Óvatosan bánjunk ezzel a megjelenítési lehetőséggel, hiszen ha nagyon összetett adattípust iratunk így ki, a kimenet nagyon szószátyár is lehet. Óvatosságból használjuk a Depth paramétert:

[10] PS C:\> $f = Get-Item C:\munka\futók.txt

[11] PS C:\> $f | Format-Custom -Depth 1

 

class FileInfo

{

  LastWriteTime =

    class DateTime

    {

      Date = 2009. 11. 21. 0:00:00

      Day = 21

      DayOfWeek = Saturday

      DayOfYear = 325

      Hour = 19

      Kind = Local

      Millisecond = 815

      Minute = 45

      Month = 11

      Second = 20

      Ticks = 633944295208158750

      TimeOfDay = 19:45:20.8158750

      Year = 2009

      DateTime = 2009. november 21. 19:45:20

    }

  Length = 254

  Name = futók.txt

}

Enélkül a fenti példában minden egyes datetime és timespan tulajdonság külön kibontásra került volna.

PowerShell 3.0 verziótól kezdve alternatív megoldásként a JSON formátumot is használhatjuk az objektumok vizsgálatára, amit a ConvertTo-JSON  cmdlettel kaphatunk meg:

PS C:\> Get-Service wuauserv | ConvertTo-Json

{

    "CanPauseAndContinue":  false,

    "CanShutdown":  true,

    "CanStop":  true,

    "DisplayName":  "Windows Update",

    "DependentServices":  [

 

                          ],

    "MachineName":  ".",

    "ServiceName":  "wuauserv",

    "ServicesDependedOn":  [

                               {

                                   "CanPauseAndContinue":  false,

                                   "CanShutdown":  false,

                                   "CanStop":  false,

                                   "DisplayName":  "Remote Procedure Call (RPC

)",

                                   "DependentServices":  null,

                                   "MachineName":  ".",

                                   "ServiceName":  "rpcss",

                                   "ServicesDependedOn":  "DcomLaunch RpcEptMa

pper",

Ennek előnye, hogy kevesebb sallangot tartalmaz, könnyebb áttekinteni az információkat, nem beszélve arról, hogy ez a formátum szabványos, így akár más rendszerek közti adatcserére is felhasználható.

Érdekes módon, ha nem egy konkrét objektumot alakítunk JSON-ná, hanem többet, akkor nem fog ez az átalakítás mélyre menni:

PS C:\> Get-Service w* | ConvertTo-Json

[

    {

        "CanPauseAndContinue":  false,

        "CanShutdown":  false,

        "CanStop":  false,

        "DisplayName":  "Windows Time",

        "DependentServices":  [

 

                              ],

        "MachineName":  ".",

        "ServiceName":  "W32Time",

        "ServicesDependedOn":  [

 

                               ],

        "ServiceHandle":  null,

        "Status":  1,

        "ServiceType":  48,

        "StartType":  3,

        "Site":  null,

        "Container":  null,

        "Name":  "W32Time",

        "RequiredServices":  [

 

                             ]

    },

    {

        "CanPauseAndContinue":  false,

        "CanShutdown":  false,

        "CanStop":  false,

        "DisplayName":  "W3C Logging Service",

        "DependentServices":  [

 

                              ],

        "MachineName":  ".",

        "ServiceName":  "w3logsvc",

        "ServicesDependedOn":  [

                                   "System.ServiceProcess.ServiceController"

                               ],

        "ServiceHandle":  null,

        "Status":  1,

        "ServiceType":  32,

        "StartType":  3,

        "Site":  null,

        "Container":  null,

        "Name":  "w3logsvc",

        "RequiredServices":  [

                                 "System.ServiceProcess.ServiceController"

                             ]

    },

Ez a fenti példában a ServicesDependedOn és a RequiredServices tulajdonságoknál láthatjuk. Ahhoz, hogy ezek is kifejtődjenek, ahhoz a -Depth paramétert kell használjuk, de csak óvatosan, nehogy túl sok eredményt kapjunk a cirkulárisan egymásra mutató tulajdonságok esetében:

PS C:\> Get-Service w* | ConvertTo-Json -Depth 3

[

    {

        "CanPauseAndContinue":  false,

        "CanShutdown":  false,

        "CanStop":  false,

        "DisplayName":  "Windows Time",

        "DependentServices":  [

 

                              ],

        "MachineName":  ".",

        "ServiceName":  "W32Time",

        "ServicesDependedOn":  [

 

                               ],

        "ServiceHandle":  null,

        "Status":  1,

        "ServiceType":  48,

        "StartType":  3,

        "Site":  null,

        "Container":  null,

        "Name":  "W32Time",

        "RequiredServices":  [

 

                             ]

    },

    {

        "CanPauseAndContinue":  false,

        "CanShutdown":  false,

        "CanStop":  false,

        "DisplayName":  "W3C Logging Service",

        "DependentServices":  [

 

                              ],

        "MachineName":  ".",

        "ServiceName":  "w3logsvc",

        "ServicesDependedOn":  [

                                   {

                                       "CanPauseAndContinue":  false,

                                       "CanShutdown":  false,

                                       "CanStop":  true,

                                       "DisplayName":  "HTTP Service",

                                       "DependentServices":  "WMPNetworkSvc WinRM Wecsvc W3SVC w3logsvc upnphost SSDPSRV Fax Spooler RemoteAccess PeerDistSvc FDResPub fdPHost",

                                       "MachineName":  ".",

                                       "ServiceName":  "HTTP",

                                       "ServicesDependedOn":  "MsQuic",

                                       "ServiceHandle":  null,

                                       "Status":  4,

                                       "ServiceType":  1,

                                       "StartType":  3,

                                       "Site":  null,

                                       "Container":  null

                                   }

                               ],

        "ServiceHandle":  null,

        "Status":  1,

        "ServiceType":  32,

        "StartType":  3,

        "Site":  null,

        "Container":  null,

        "Name":  "w3logsvc",

        "RequiredServices":  [

                                 {

                                     "CanPauseAndContinue":  false,

                                     "CanShutdown":  false,

                                     "CanStop":  true,

                                     "DisplayName":  "HTTP Service",

                                     "DependentServices":  "WMPNetworkSvc WinRM Wecsvc W3SVC w3logsvc upnphost SSDPSRV Fax Spooler RemoteAccess PeerDistSvc FDResPub fdPHost",

                                     "MachineName":  ".",

                                     "ServiceName":  "HTTP",

                                     "ServicesDependedOn":  "MsQuic",

                                     "ServiceHandle":  null,

                                     "Status":  4,

                                     "ServiceType":  1,

                                     "StartType":  3,

                                     "Site":  null,

                                     "Container":  null

                                 }

                             ]

    },

Vigyázni kell a ConvertTo-JSON-nál, hogy az aposztrófot tartalmazó szövegeket átalakítja unikódos:

PS C:\> $obj = [pscustomobject] @{egy = "ez egy ' aposztóf"}

PS C:\> $obj | ConvertTo-Json

{

    "egy":  "ez egy \u0027 aposztóf"

}

Látható, hogy az aposztróf karakterből egy \u0027 kód lett. Ahhoz, hogy ezt visszakapjuk eredeti formátumába a [regex] osztály Unescape  metódusát hívhatjuk segítségül:

PS C:\> $obj | ConvertTo-Json | ForEach-Object {[regex]::Unescape($_)}

{

    "egy":  "ez egy ' aposztóf"

}



Word To HTML Converter