我使用以下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
来获取我想要的输出的方法?
答案 0 :(得分:5)
PowerShell有自己的方式来显示System.IO.DirectoryInfo
和System.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