Есть ли у 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