PSCustomObject 是否有其显示到控制台的顺序?

Does PSCustomObject have an order in which its displayed to the console?

早上好,

我非常喜欢从列出的项目返回的值中进行选择。因此,我正准备从 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 在我的顶部对象显示之前被提示?我想在选择之前先看看选择 lol

是否有显示顺序?

格式化系统如何给用户带来惊喜的类似示例。

有一个简单的 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-HostOut-Default 或任何 Format-* cmdlet..

强制输出到格式化程序
@'
OneProperty
test
'@ | ConvertFrom-Csv | Out-Default

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


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


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

我们可以看到两者都显示完整。简而言之,Read-Host cmdlet 将您的管道输出输出到格式化系统。

您还可以用子表达式包围 commands/sections 代码并将其通过管道传递给变量。

$(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