3

各位早安,

我非常喜欢从列出的项目返回的值中进行选择。因此,我正在从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在脚本末尾添加 a 来进行选择时,我首先得到该提示:

[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在显示顶部对象之前提示我?在我选择大声笑之前我想看看选择

是否有显示顺序?

4

1 回答 1

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-Hostcmdlet 只是将您的管道输出击败到格式化系统。

您还可以使用子表达式将命令/代码段包围起来,并将其通过管道传递给变量。

$(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
于 2021-04-17T16:41:05.510 回答