18

我正在尝试获取特定子文件夹结构中文件的递归列表,然后将它们保存到表中,以便我可以使用 foreach 循环来处理每一行。我有以下代码:

$table = get-childitem -recurse | where {! $_.PSIsContainer} | Format-Table Name, Length

foreach ($row in $table)
{
  $row[0]
  $row[1]
}

如果我尝试按$table原样输出,它看起来很完美,所有文件都有两列数据。如果我尝试使用 foreach(如上)逐步完成,我会收到"Unable to index into an object of type Microsoft.PowerShell.Commands.Internal.Format.FormatEndData."错误消息。

我究竟做错了什么?

4

3 回答 3

31

我不知道您为什么要尝试逐步浏览格式化数据。但实际上,$table它只是字符串的集合。因此,您可以执行以下操作:

$table = get-childitem -recurse | where {! $_.PSIsContainer} | Format-Table Name, Length

foreach ($row in $table)
{
  $row
}

但我不知道你为什么想要。如果你想对文件中的数据做一些事情,你可以试试这个:

$files = get-childitem -recurse | where {! $_.PSIsContainer}
foreach ($file in $files)
{
    $file.Name
    $file.length
}
于 2012-07-19T20:03:52.000 回答
14

在完全处理完数据之前,切勿使用任何格式命令。格式命令将所有内容都转换为字符串,因此您会丢失原始对象。

$table = get-childitem -recurse | where {! $_.PSIsContainer}
foreach($file in $table){
    $file.Name
    $file.FullName
}
于 2012-07-19T19:59:10.190 回答
1

刚才我正在清理一些配置文件,并在我的过程中发现了这篇文章,并想我会分享我如何循环遍历 get-childitem 的结果(我认为 ls 只是 gci 的别名?)。希望这可以帮助某个地方的人。

$blob = (ls).name 
foreach ($name in $blob) { 
get-childitem "D:\CtxProfiles\$name\Win2012R2v4\UPM_Profile\AppData\Local\Google\Chrome\User Data\Default\Default\Media Cache\f_*" -erroraction 'silentlycontinue'|remove-item -force -recurse -confirm:$false 
}
于 2018-09-11T17:21:56.943 回答