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

Доброе утро, голубчики,

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

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

[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 запрашивается перед отображением моего верхнего объекта? Я хотел бы увидеть выбор, прежде чем я выберу, лол

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


person Abraham Zinala    schedule 17.04.2021    source источник
comment
Должен ли я назначать свой объект переменной, а затем отображать ее перед приглашением?   -  person Abraham Zinala    schedule 17.04.2021
comment
nvm, только что попробовал, все равно не работает.   -  person Abraham Zinala    schedule 17.04.2021
comment
Я понимаю, что он сначала стреляет по умолчанию. Затем следует out-host, но это не похоже на то, что сам объект потребляется, или нет?   -  person Abraham Zinala    schedule 17.04.2021
comment
хм, интересная тема. Моя работа на данный момент заключается в том, чтобы назначить вывод переменной, а затем передать ее в out-host. Итак: $Obj = for($i=0; $i -lt...... Затем $obj | out-host. Просто запутался в том, как Read-Host выходит на экран раньше, чем объект. Даже несмотря на то, что там уже должен быть Out-Host? может быть, я слишком много думаю об этом.   -  person Abraham Zinala    schedule 17.04.2021
comment
Так что это мое лучшее объяснение того, как я это понимаю. Весь сценарий анализируется до того, как что-либо будет запущено. Любой -Host идет прямо к форматеру powershell для вывода. Остальное проходит через конвейер powershell, прежде чем, наконец, будет отправлено в систему форматирования/вывода. Если вы добавите Out-Host, он сначала попадет в систему форматирования и, следовательно, будет в правильном порядке. Вот почему даже добавление команды сна не помогает. Вы также можете просто заключить весь блок кода в круглые скобки и передать его внешнему хосту вместо назначения переменной.   -  person Doug Maurer    schedule 17.04.2021
comment
Отсутствие синхронизации между выводом конвейера и другими потоками вывода ограничено PS v5+ и очень специфическим, хотя и все еще распространенным сценарием: вывод в неявном формате таблицы для типов, которые не для них определены данные форматирования. Неоптимальный обходной путь заключается в том, чтобы принудительно синхронизировать вывод конвейера с хостом (дисплеем) с помощью Out-Host — см. этот ответ на связанный дубликат.   -  person mklement0    schedule 17.04.2021


Ответы (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
person Doug Maurer    schedule 17.04.2021
comment
Я думаю, что следую, но как оператор подвыражения позволяет ему иметь приоритет? Итак, когда скрипт выполняется, он анализируется целиком, а не по одному командлету? Я думаю, что это имеет смысл, потому что это дает вам ошибку, если вам не хватает заключительного оператора или чего-то длинного в этих строках. Этот пост мне подходит! Хотя я хотел бы глубже понять, почему он ждет, не означает ли это, что каждый другой psobject будет ждать до конца, чтобы отобразиться? - person Abraham Zinala; 17.04.2021
comment
Итак, скажем, у вас есть что-то вроде этого: [psobject,] here, read-host "something";[anotherhere] here2 Read-Host "something else". Разве не все прочитанные хосты будут выполняться первыми? - person Abraham Zinala; 17.04.2021
comment
Проще говоря, командлет Read-Host просто опережает вывод вашего конвейера в систему форматирования — в этом суть проблемы, и это происходит только в очень специфических — хотя и все еще распространенных — обстоятельствах — см. этот ответ. Другая описанная вами проблема - исчезновение свойств - также распространена, но не связана с вопросом; это подробно обсуждается в этом ответе. - person mklement0; 17.04.2021
comment
Сейчас прочитаю, спасибо! - person Abraham Zinala; 17.04.2021