Powershell PSCustomObject是否有向控制台显示其内容的顺序?
早上好,皮普斯 我非常喜欢从列表项返回的值中进行选择。因此,我在从C:\Users返回的值中进行选择,这是输入到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
[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只会将管道输出传送到格式化系统”-这是问题的症结所在,并且只会在非常特定的情况下发生-尽管仍然很常见-请参见。您描述的另一个问题-“正在消失”属性-也是常见的,但这是一个附带的问题;我们将在中进行深入讨论。现在就来读一下,谢谢!