Есть ли у PSCustomObject порядок, в котором он отображается на консоли? [дубликат]

Доброе утро выглядывает,

Я большой поклонник делать выбор из значений, которые возвращаются из перечисленных элементов. Итак, я истекал, делая выбор из значений, возвращаемых из C:\Users , который вводится в тип, но заметил что-то не так. Я могу перечислить выбор в [PSCustomObject] просто отлично вот так:

      [array]$Userlist = Get-ChildItem C:\users | Sort-Object -Property LastWriteTime -Descending
        for($i=0; $i -lt $UserList.BaseName.count; $i++){
        [PSCustomObject]@{
                'Profile Name'  = "$($i): $($UserList.BaseName[$i])"
                '  Full Path  ' = $UserList.FullName[$i] 
                'Modified Time' = $UserList.LastWriteTime[$i] 
                        }
                    }

#Output:
Profile Name   Full Path      Modified Time        
------------ -------------    -------------        
0: Abraham   C:\users\Abraham 4/11/2021 10:26:58 PM
1: Public    C:\users\Public  3/28/2021 8:51:28 AM 

..но когда я пытаюсь сделать выбор, просто добавляя в конец скрипта, я сначала получаю это приглашение:

      [array]$Userlist = Get-ChildItem C:\users | Sort-Object -Property LastWriteTime -Descending
        for($i=0; $i -lt $UserList.BaseName.count; $i++){
        [PSCustomObject]@{
                'Profile Name'  = "$($i): $($UserList.BaseName[$i])"
                '  Full Path  ' = $UserList.FullName[$i] 
                'Modified Time' = $UserList.LastWriteTime[$i] 
                        }
                    }
                
              
$ii = Read-Host -Prompt "Enter The Users Number to Delete"
$i  = $ii -split " "
      ""
    foreach($profile in $Userlist.baseName[$i]){
        ""
        "Selection: $profile"
        }

#output
Enter The Users Number to Delete: 1    <------ Here its asking first before displaying.
Profile Name   Full Path      Modified Time        
------------ -------------    -------------        
0: Abraham   C:\users\Abraham 4/11/2021 10:26:58 PM
1: Public    C:\users\Public  3/28/2021 8:51:28 AM 


Selection: Public

Я что-то пропустил? Почему мой Read-Hostзапрашивается перед отображением моего верхнего объекта? Я хотел бы увидеть выбор, прежде чем я выберу lol

Есть ли порядок, в котором это отображается?

1 ответ

Решение

Похожий пример того, как система форматирования может удивить пользователей.

Имейте простой CSV

      @'
OneProperty
test
'@ | ConvertFrom-Csv

OneProperty
-----------
test  

И другой

      @'
OneProperty,TwoProperty
test1,test2
'@ | ConvertFrom-Csv

OneProperty TwoProperty
----------- -----------
test1       test2  

Все идеально, как и ожидалось.

Но управляя ими вместе

      @'
OneProperty
test
'@ | ConvertFrom-Csv

@'
OneProperty,TwoProperty
test1,test2
'@ | ConvertFrom-Csv

OneProperty
-----------
test       
test1      

Где вторая недвижимость? Что ж, первый объект, который попадает в систему форматирования, - это то, что определяет свойства. Powershell не будет проверять каждый элемент, потому что это может сильно снизить производительность. Однако, если вы принудительно отправляете вывод в форматтер с помощью Out-Host, Out-Default, или любой из Format-* командлеты ..

      @'
OneProperty
test
'@ | ConvertFrom-Csv | Out-Default

@'
OneProperty,TwoProperty
test1,test2
'@ | ConvertFrom-Csv | Out-Default


OneProperty
-----------
test       


OneProperty TwoProperty
----------- -----------
test1       test2   

Мы видим, что оба показаны полностью. Проще говоря, Read-Host командлет просто превосходит ваш конвейерный вывод в систему форматирования.

Вы также можете окружать команды / разделы кода подвыражением и передавать его по конвейеру вместо присвоения переменной.

      $(for($i=0; $i -lt $UserList.BaseName.count; $i++){
    [PSCustomObject]@{
        'Profile Name'  = "$($i): $($UserList.BaseName[$i])"
        '  Full Path  ' = $UserList.FullName[$i] 
        'Modified Time' = $UserList.LastWriteTime[$i] 
    }
}) | Out-Default
Другие вопросы по тегам