如何将Get-ChildItem -Recurse结果分组到一个输出表中?

Jer*_*oen 7 powershell

我正在使用以下Powershell命令:

Get-ChildItem -Recurse *.txt
Run Code Online (Sandbox Code Playgroud)

但是,如果有多个结果,则输出将如下所示:

Get-ChildItem -Recurse *.txt
Run Code Online (Sandbox Code Playgroud)

但是我以某种形式获得分组结果。

可能是这样的:

    Directory: C:\TestFolder\myfolder\

Mode          LastWriteTime   Length Name
----          -------------   ------ ----
-a---     d/m/yyyy hh:MM PM   1234   dragons.txt

    Directory: C:\TestFolder\anotherfolder\

Mode          LastWriteTime   Length Name
----          -------------   ------ ----
-a---     d/m/yyyy hh:MM PM   66550  jabberwocky.txt
Run Code Online (Sandbox Code Playgroud)

或这个:

Mode          LastWriteTime   Length Directory                     Name
----          -------------   ------ ---------                     ----
-a---     d/m/yyyy hh:MM PM   1234   C:\TestFolder\myfolder\       dragons.txt
-a---     d/m/yyyy hh:MM PM   66550  C:\TestFolder\anotherfolder\  jabberwocky.txt
Run Code Online (Sandbox Code Playgroud)

您可能会明白。我如何才能做到这一点,最好以简单而优雅的方式完成?

我试过了,Get-ChildItem -Recurse *.txt | Format-Table但这没什么用。我还检查了Stack Overflow提出的最相关的类似问题(即“ 使用PowerShell的Get-ChildItem递归 ”,以及其他问题),但是到目前为止,还没有能够提炼出解决方案。


附录

我使用help group并发现它group实际上是我想寻找的Cmdlet的确切别名:Group-Object。如果我这样做:

Length  FullPath
------  --------
1234    C:\TestFolder\myfolder\dragons.txt
66550   C:\TestFolder\anotherfolder\jabberwocky.txt
Run Code Online (Sandbox Code Playgroud)

我得到:

Get-ChildItem -Recurse *.txt | Group-Object "FullName"
Run Code Online (Sandbox Code Playgroud)

但这需要我简化一个附加步骤以:

Count   Name           Group
-----   --------       -----
    1   C:\TestFold... {C:\TestFolder\myfolder\dragons.txt}
    1   C:\TestFold... {C:\TestFolder\anotherfolder\jabberwocky.txt}
Run Code Online (Sandbox Code Playgroud)

得到:

Get-ChildItem -Recurse *.txt | Group-Object "FullName" | Select-Object "Name"
Run Code Online (Sandbox Code Playgroud)

如果我真的想要额外的属性,那么我想我想“对多个属性进行分组”,从而使问题实际上是另一个SO问题的重复。

但是,所有这些“分组”似乎都不过分。有没有直接的方法Get-ChildItem来获取我想要的输出?

Mat*_*att 7

PowerShell具有自己的显示方式System.IO.DirectoryInfoSystem.IO.FileInfo对象。如果您不想看到它,则只需要使用即可Select-Object

Get-ChildItem -Recurse c:\temp | select Mode,LastWriteTime,Length,Directory,Name
Run Code Online (Sandbox Code Playgroud)

Group-Object完全没有必要。鉴于您的需要,我想Group-Object似乎很有吸引力,但此处不需要它的功能,就像链接问题中使用的那样。您真正想做的是更改PowerShell处理这些对象的方式。Format-Table由于相同的原因而无法正常工作。它通过设计输出来使用PowerShell并制作一个表。如果您使用调用属性,Format-Table则将具有与相同的解决方案Select-Object

Get-ChildItem -Recurse c:\temp | Format-Table Mode,LastWriteTime,Length,Directory,Name
Run Code Online (Sandbox Code Playgroud)

请...请...如果要在其他功能中使用输出,请不要使用该行。Format-cmdlet破坏对象,仅用于显示数据。