Невозможно вывести PSCustomObject - PullRequest
0 голосов
/ 26 февраля 2020

Я ввожу коллекцию, затем мне нужно выполнить l oop, чтобы создать пользовательский объект. Имена в объекте все уникальны. Я надеюсь иметь PSCustomObject в переменной, которую я смогу использовать позже.

Function Get-PSCustomObjectAsOutputType {

     $services = get-service | select -First 5
     [hashtable]$properties
     $X = 0
     foreach ($s in $services)
        {
            $properties += @{"Name$x" = $S.name
                            "Status$x" = $S.status
                            "Displayname$x" = $S.displayName
                           }
            $obj = New-Object -TypeName PSCustomObject -Property $properties
            $x++     
         }

        $Obj
}

Похоже, что $ null происходит, когда я присваиваю его переменной.

$TheTypeNeedsToBePSCustomOutputType = Get-PSCustomObjectAsOutputType

$TheTypeNeedsToBePSCustomOutputType.PSobject.TypeNames

Мне нужно что System.Object [] будет PSCustomObject

PS> $ TheTypeNeedsToBePSCustomOutputType.PSobject.TypeNames

System.Object[]
System.Array
System.Object

$TheTypeNeedsToBePSCustomOutputType.PSObject

«$ null» в базовом объекте становится на моем пути.

BaseObject          : {$null, @{Displayname3=Application Layer Gateway Service; Name4=AppIDSvc; Displayname2=AllJoyn Router 
                      Service; Displayname0=Agent Activation Runtime_8af1b; Status0=Stopped; Status2=Stopped; Name3=ALG; 
                      Displayname1=Intel® SGX AESM; Name2=AJRouter; Name1=AESMService; Status1=Running; Status3=Stopped; 
                      Name0=AarSvc_8af1b; Status4=Stopped; Displayname4=Application Identity

Ответы [ 2 ]

3 голосов
/ 26 февраля 2020

Я не уверен, почему вы назначаете properties на $obj, когда оно перезаписывается каждый раз, когда происходит l oop. Если я не ошибаюсь, вы намереваетесь вернуть заполненную хеш-таблицу $properties после завершения l oop.

Кроме того, объявление Hashtable неверно. Вы можете просто использовать @ {} для определения хеш-таблицы. Если вы заинтересованы в получении PSCustomObject, вы можете привести HashTable к PSCustomObject.

Function Get-PSCustomObjectAsOutputType {

     $services = get-service | select -First 5
     $properties = @{}
     $X = 0
     foreach ($s in $services)
        {
            $properties += @{"Name$x" = $S.name
                            "Status$x" = $S.status
                            "Displayname$x" = $S.displayName
                           }
            $x++     
         }
        [PsCustomObject]$properties
}

$TheTypeNeedsToBePSCustomOutputType = Get-PSCustomObjectAsOutputType
$TheTypeNeedsToBePSCustomOutputType.GetType()

# Output :
IsPublic IsSerial Name                                     BaseType                                                                                                                                                                                  
-------- -------- ----                                     --------                                                                                                                                                                                  
True     False    PSCustomObject                           System.Object    

Я не уверен, как вы планируете получать их, так как вы просто складываете все свойства вместе. Я бы предложил использовать хеш-таблицу с ключом и присвоить каждому из них значения в качестве значений.

Function Get-PSCustomObjectAsOutputType {

    $services = get-service | select -First 5
    $properties = @{}
    $X = 0
    foreach ($s in $services)
    {
        # Use $x as number or use $s.Name as the key for this service.
        $properties[$x] = @{Name = $S.name
                        Status = $S.status
                        Displayname = $S.displayName
                        }
        $x++     
        }
    [PsCustomObject]$properties
}

1 голос
/ 26 февраля 2020

Итак, вы приводите переменную, даже не назначая ее. Так что ноль в ноль. Позже, когда вы используете оператор + =, вы добавляете таблицу ha sh в ноль. Результатом этой операции является массив, в котором индекс 0 равен нулю, а индекс 1 и далее представляют собой таблицы ha sh.

Я несколько удивлен, что приведение к нулю инициирует переменную.

Тест:

[hashtable]$properties
Get-Variable properties

Это возвращает Cannot find a variable with the name 'properties'. Тем не менее, если вы прокомментируете эту строку, функция действительно вернет PSCustomObject.

Тем не менее, я думаю, реальная проблема в том, что вы создаете объект внутри l oop. И так, воссоздавая его на каждой итерации. Кажется, это не является целью вашего кода.

Если я правильно интерпретирую ваше намерение, вы хотите создать один большой объект со свойствами, названными постепенно для каждой службы, с которой вы сталкиваетесь.

Попробуйте эти незначительные корректировки:

Function Get-PSCustomObjectAsOutputType
{
    $Services = Get-Service | Select -First 5
    $Properties = [Ordered]@{}

    # Ordered can only be on a literal

    For( $i = 0; $i -le $Services.Count; ++$i)
    {
        $Service = $Services[$i] # Assign a var; easier to reference
        $Properties +=
        @{
            "Name$i" = $Service.Name
            "Status$i" = $Service.Status
            "Displayname$i" = $Service.DisplayName
        }
    }

[PSCustomObject]$Properties # Another way to create the object...

} #End Function Get-PSCustomObjectAsOutputType

Обратите внимание, что я использовал заказанный ха sh. Это должно сделать ваш вывод немного более читабельным.

Я также использовал a для l oop, что избавляет вас от необходимости увеличивать переменную самостоятельно ...

Дайте мне знать, если это помогает. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...