2015-10-02 20 views
3

我使用下面的PowerShell命令:如何將Get-ChildItem -Recurse結果分組到一個輸出表中?

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實際上是我認爲我一直在尋找小命令的確切別名: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 

如果我真的想要額外的屬性,那麼我想我想「組多個屬性」,使問題有效地重複this other SO question

但是,所有這些「分組」似乎過度殺傷。是否沒有直接的方式使用Get-ChildItem來獲得我想要的輸出?

回答

4

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-cmdlet會破壞對象,並且僅用於顯示數據的目的

+0

非常感謝您!很高興我決定發佈畢竟。我現在看到我的「答案」實際上是一個糟糕的解決方法,我已經刪除了「答案」並將其納入我的問題中(因爲它不會以任何方式使答案無效)。 Thx再次爲更簡單的解決方案。 – Jeroen

0

如果您只是試圖以其全路徑名稱遞歸獲取文件列表,請勿使用Group或Select。所有這些命令都假裝爲顯示在文本控制檯中的對象的電子表格。

改爲使用foreach-object運算符「%{}」將原始字符串日期轉儲到控制檯。例如:

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

(順便說一下上面的等價於linux命令:「找到。」)

如果你想看到哪些字段是從的foreach對象腳本塊訪問。您可以發出以下命令:

Get-ChildItem my_filepath | get-member 

或者,你可以管得到-ChildItem的輸出導出-CSV命令,並在記事本中打開它。

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

notepad files.csv 

或者,使用CMD:

cmd /c dir /b /s *.txt 
相關問題