Powershell - формат вывода скрипта такой же, как у консоли

Я запускаю командлет PS как в консоли, так и в скрипте, но форматы вывода, которые я вижу, разные.

Код:

function Print-UnhealthySubServiceEntities($unhealthyServices)
{
    if($unhealthyServices -eq $null)
    {
        return
    }

    write-Output "- Unhealthy Services:"
    $unhealthyServices | Get-ServiceFabricServiceHealth

    $unhealthyPartitions = $unhealthyServices | Get-ServiceFabricPartition | where { $_.HealthState -ne "Ok" }
    write-Output "- Unhealthy Partitions:"
    $unhealthyPartitions | Get-ServiceFabricPartitionHealth

    $unhealthyReplicas = $unhealthyPartitions | Get-ServiceFabricReplica | where { $_.HealthState -ne "Ok" }
    write-Output "- Unhealthy Replicas:"
    $unhealthyReplicas | Get-ServiceFabricReplicaHealth
}

function Print-UnhealthyEntities
{
    # non-system apps
    write-output "$(Get-TimeAndLineNum) Printing details of unhealthy entities for Non-System Applications:"

    $unhealthyApps = Get-ServiceFabricApplication | where { $_.HealthState -ne "Ok" }

    write-Output "- Unhealthy Applications:"
    $unhealthyApps | Get-ServiceFabricApplicationHealth

    $unhealthyServices = $unhealthyApps | Get-ServiceFabricService | where { $_.HealthState -ne "Ok" }
    Print-UnhealthySubServiceEntities $unhealthyServices

    # system app (there is only one)
    write-output "$(Get-TimeAndLineNum) Printing details of unhealthy entities for System Applications:"

    write-Output "- Unhealthy Application:"
    Get-ServiceFabricApplicationHealth fabric:/System | where { $_.AggregatedHealthState -ne "Ok" }

    $unhealthySysServices = Get-ServiceFabricService -ApplicationName "fabric:/System" | where { $_.HealthState -ne "Ok" }
    Print-UnhealthySubServiceEntities $unhealthySysServices

    # nodes
    write-output "$(Get-TimeAndLineNum) Printing details of unhealthy nodes:"

    Get-ServiceFabricNode  | where { $_.HealthState -ne "Ok" } | Get-ServiceFabricNodeHealth

}

Вывод с консоли:

PS> $unhealthySysServices | Get-ServiceFabricPartition | 
      Get-ServiceFabricReplica | Get-ServiceFabricReplicaHealth


PartitionId           : a181d7d3-9828-4287-a183-de7727bdc147
InstanceId            : 131678681384668237
AggregatedHealthState : Warning
UnhealthyEvaluations  :
                        Unhealthy event: SourceId='System.FabricDnsService', Property='Environment', HealthState='Warning', ConsiderWarningAsError=false.

HealthEvents          :
                        SourceId              : System.RA
                        Property              : State
                        HealthState           : Ok
                        SequenceNumber        : 131678681385448280
                        SentAt                : 4/10/2018 9:08:58 PM
                        ReceivedAt            : 4/10/2018 9:09:03 PM
                        TTL                   : Infinite
                        Description           : Replica has been created on_Node_0.
                        For more information see: http://aka.ms/sfhealth
                        RemoveWhenExpired     : False
                        IsExpired             : False
                        Transitions           : Warning->Ok = 4/10/2018 9:09:03 PM, LastError = 1/1/0001 12:00:00 AM

                        SourceId              : System.FabricDnsService
                        Property              : Socket
                        HealthState           : Ok
                        SequenceNumber        : 131678681487009623
                        SentAt                : 4/10/2018 9:09:08 PM
                        ReceivedAt            : 4/10/2018 9:09:08 PM
                        TTL                   : Infinite
                        Description           : DnsService is listening on port 53.
                        RemoveWhenExpired     : False
                        IsExpired             : False
                        Transitions           : Warning->Ok = 4/10/2018 9:09:08 PM, LastError = 1/1/0001 12:00:00 AM

                        SourceId              : System.FabricDnsService
                        Property              : Environment
                        HealthState           : Warning
                        SequenceNumber        : 131679155816154400
                        SentAt                : 4/11/2018 10:19:41 AM
                        ReceivedAt            : 4/11/2018 10:19:41 AM
                        TTL                   : Infinite
                        Description           : FabricDnsService is not preferred DNS server on the node.
                        RemoveWhenExpired     : False
                        IsExpired             : False
                        Transitions           : Ok->Warning = 4/11/2018 10:19:41 AM, LastError = 1/1/0001 12:00:00 AM

Обратите внимание, что HealthEvents красиво отформатированы.

Теперь вывод из скрипта:

HealthEvents          : {SourceId: 'System.RA', Property: 'State', Ok, "Replica has been created on_Node_0.
                        For more information see: http://aka.ms/sfhealth", TimeToLive 10675199.02:48:05.4775807, RemoveWhenExpired False, SequenceNumber 131678681385448280: IsExpired
                        False, SourceId: 'System.FabricDnsService', Property: 'Socket', Ok, "DnsService is listening on port 53.", TimeToLive 10675199.02:48:05.4775807, RemoveWhenExpired
                        False, SequenceNumber 131678681487009623: IsExpired False, SourceId: 'System.FabricDnsService', Property: 'Environment', Warning, "FabricDnsService is not preferred
                        DNS server on the node.", TimeToLive 10675199.02:48:05.4775807, RemoveWhenExpired False, SequenceNumber 131679155816154400: IsExpired False}
UnhealthyEvaluations  : {HealthState: Warning: Unhealthy event: SourceId='System.FabricDnsService', Property='Environment', HealthState='Warning', ConsiderWarningAsError=false.}
InstanceId            : 131678681384668237
Kind                  : Stateless
PartitionId           : a181d7d3-9828-4287-a183-de7727bdc147
Id                    : 131678681384668237
AggregatedHealthState : Warning

Это когда запускается как сценарий PS с той же консоли. Обратите внимание, что HealthEvents труднее читать.

Как отформатировать вывод скрипта так, чтобы его можно было читать так же, как и консоль?

Вы получите такое же форматирование, если уберете в скрипте фильтрацию Where-Object? Кроме того, откуда в консоли берется $ unhealthySysServices?

EBGreen 11.04.2018 14:44

Вы можете попробовать использовать Out-String для "принудительного" явного запуска .toString().

Seth 11.04.2018 14:52

@Seth: это стоит попробовать, но обратите внимание, что Out-String использует систему форматирования вывода PowerShell, как здесь предполагается, но это не то же самое, что .ToString().

mklement0 11.04.2018 16:52
1
3
89
0

Другие вопросы по теме