Powershell PSCustomObject是否有向控制台显示其内容的顺序?

Powershell PSCustomObject是否有向控制台显示其内容的顺序?,powershell,pscustomobject,powershell-5.1,Powershell,Pscustomobject,Powershell 5.1,早上好,皮普斯 我非常喜欢从列表项返回的值中进行选择。因此,我在从C:\Users返回的值中进行选择,这是输入到[PSCustomObject]类型中的结果,但我注意到了一些问题。我可以在[PSCustomObject]中列出所选内容,如下所示: [array]$Userlist = Get-ChildItem C:\users | Sort-Object -Property LastWriteTime -Descending for($i=0; $i -lt $UserList

早上好,皮普斯

我非常喜欢从列表项返回的值中进行选择。因此,我在从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
[array]$Userlist=Get ChildItem C:\users |排序对象-属性LastWriteTime-降序
对于($i=0;$i-lt$UserList.BaseName.count;$i++){
[PSCustomObject]@{
“配置文件名”=“$($i):$($UserList.BaseName[$i])”
“完整路径”=$UserList.FullName[$i]
“修改时间”=$UserList.LastWriteTime[$i]
}
}
$ii=读取主机-提示“输入要删除的用户编号”
$i=$ii-拆分“”
""
foreach($Userlist.baseName[$i]中的配置文件){
""
“选择:$profile”
}
#输出

输入要删除的用户编号: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-*
cmdlet将输出强制到格式化程序

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

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


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


OneProperty TwoProperty
----------- -----------
test1       test2   
我们可以看到这两个都完全显示出来了。简单地说,
Read-Host
cmdlet只是将管道输出传递到格式化系统

您还可以使用子表达式包围命令/代码段,并将其与赋值给变量进行比较

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

我是否必须将我的对象分配给一个变量,然后在提示之前显示它?nvm,刚刚尝试过,但仍然不起作用。我知道它首先会跳出默认值。那么,我们的主机应该在后面,但是,它不像对象本身正在被消费,或者它是吗?嗯,有趣的话题。我目前的工作是将输出分配给一个变量,然后通过管道将其传送到主机
out
。所以:
$Obj=for($i=0;$i-lt….
。然后,
$obj | out host
。只是对
Read host
如何在对象出现之前进入屏幕感到困惑。即使如此,应该已经有一个
out host
了?也许我想得太多了。因此,这是我对如何理解它的最好解释。整个脚本都是在任何事情之前解析的已运行。任何-主机都将直接进入powershell格式化程序进行输出。其余主机在最终发送到格式化/输出系统之前通过powershell管道。如果您添加了主机,它实际上将首先进入格式化系统,因此顺序正确。这就是为什么即使添加sleep命令也没有帮助。您也可以使用括号将整个代码块包围起来,并将其输送到主机,而不是分配给变量。我想我会继续关注,但是,子表达式运算符如何允许它优先?因此,在执行脚本时,会一次对其进行完全分析,而不是使用cmdlet?我认为这是有道理的如果你遗漏了一个结束语句,或是一个很长的句子,就会给你一个错误。这篇文章对我来说已经足够好了!虽然我想更深入地了解为什么它会等待,但这不意味着其他所有psobject都会等到最后才显示出来吗?所以,假设你有这样的东西:
[psobject,]这里,阅读主机“某物”;[anotherhere]这里2 Read Host“something other”
。难道不是所有的Read hosts都会首先执行吗?“简单地说,Read-Host cmdlet只会将管道输出传送到格式化系统”-这是问题的症结所在,并且只会在非常特定的情况下发生-尽管仍然很常见-请参见。您描述的另一个问题-“正在消失”属性-也是常见的,但这是一个附带的问题;我们将在中进行深入讨论。现在就来读一下,谢谢!