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

时间:2015-10-02 12:02:40

标签: powershell

我使用以下Powershell命令:

Get-ChildItem -Recurse *.txt

但如果有多个结果,输出将如下:

    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

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

也许是这样的:

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

或者这个:

Length  FullPath
------  --------
1234    C:\TestFolder\myfolder\dragons.txt
66550   C:\TestFolder\anotherfolder\jabberwocky.txt

你可能会明白这个想法。我怎样才能做到这一点,最好以简单而优雅的方式实现?

我试过Get-ChildItem -Recurse *.txt | Format-Table,但这并没有做多少。我还检查了Stack Overflow建议的最相关的类似问题(即" Recurse with PowerShell's Get-ChildItem"和其他),但到目前为止还没有能够提炼解决方案

附录

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

Get-ChildItem -Recurse *.txt | Group-Object "FullName"

我明白了:

Count   Name           Group
-----   --------       -----
    1   C:\TestFold... {C:\TestFolder\myfolder\dragons.txt}
    1   C:\TestFold... {C:\TestFolder\anotherfolder\jabberwocky.txt}

但这需要我简化附加步骤

Get-ChildItem -Recurse *.txt | Group-Object "FullName" | Select-Object "Name"

获得:

Name
----
C:\TestFolder\myfolder\dragons.txt
C:\TestFolder\anotherfolder\jabberwocky.txt

如果我真的想要额外的属性,那么我想我想"分组多个属性",使问题有效地与{ {3}}。

然而,所有这些"分组"看起来有点矫枉过正。是否没有直接使用Get-ChildItem来获取我想要的输出的方法?

2 个答案:

答案 0 :(得分:5)

PowerShell有自己的方式来显示System.IO.DirectoryInfoSystem.IO.FileInfo个对象。如果您不想看到,那么您只需要使用Select-Object

Get-ChildItem -Recurse c:\temp | select Mode,LastWriteTime,Length,Directory,Name

Group-Object完全没必要。鉴于你的需要,我认为Group-Object似乎很有吸引力,但这里不需要它的功能,就像在链接问题中使用它一样。您真正想要做的是改变PowerShell处理这些对象的方式。 Format-Table因同样的原因无效。它通过设计输出和制作表格来获取PowerShell。如果您使用Format-Table调用属性,则可以使用与Select-Object相同的解决方案。

Get-ChildItem -Recurse c:\temp | Format-Table Mode,LastWriteTime,Length,Directory,Name

请...如果您打算在其他功能中使用输出,请不要使用该行。 Format-cmdlets中断对象,仅用于显示数据。

答案 1 :(得分:0)

如果您只是尝试使用其完整路径名称递归获取文件列表,请不要使用“组”或“选择”。所有这些命令都假装是在文本控制台中显示的对象的电子表格。

而是使用foreach-object运算符"%{}"将原始字符串日期转储到控制台。例如:

Get-ChildItem -Recurse *.txt | %{ $_.fullname }

(顺便说一句,上面相当于linux命令:" find。")

如果要查看可从foreach-object脚本块访问哪些字段。你可以发出这个命令:

Get-ChildItem my_filepath  | get-member

或者,您可以将Get-ChildItem的输出传递给Export-Csv命令并在记事本中打开它。

Get-ChildItem -Recurse -file *.txt | 
Select FullName | 
Export-Csv "files.csv"

notepad files.csv

或者,使用cmd:

cmd /c dir /b /s *.txt