2014-10-17 97 views
1

這裏就是我想要做:PowerShell的搜索

  1. 搜索我的電腦帶有.doc和.docx,.xls的,或.xlsx
  2. 輸出文件名和大小結尾的文件(以按文件擴展名分組)到名爲「File_Summary.txt」的文本文件中。
  3. 我也希望輸出中列出的每個文件擴展名的文件數量和總文件大小的總和。

我甚至無法讓過去的支票夾部分:

$Folder_To_Check = C:\AIU 

$Report_File_Location = "File_Summary.txt" 

$files= Get-Childitem -Path $Folder_To_Check-Include *doc, *docx, *xls, *xlsx $Report_File_Location 
$totalfiles = ($files | Measure-Object).Count 
$totalsize = ($files | Measure-Object -Sum Length).Sum 

更新。這是我的代碼,再次對這些建議做了一些修改,但我仍然空着。

$Report_File_Location = "File_Summary.txt" 

$files= Get-Childitem C:\AIU -include "*doc", "*docx", "*xls", "*xlsx"-recurse | Sort-Object | Get-Unique -asString 

$files | Out-File $Report_File_Location 

$totalfiles = ($files | Measure-Object).Count 
$totalsize = ($files | Measure-Object -Sum Length).Sum 

write-host "totalfiles: $totalfiles" 
write-host "totalsize: $totalsize" 

越我一直在尋找這個我覺得我不應該用Sort-Object而是利用Group Extension -NoElement | Sort Count -Descending這會給我爲每種類型文件的總數是多少?

UPDATE 感謝這裏的人的幫助,我得到了我的代碼工作。但是我遇到了一個問題,那就是說我的文件不存在。問題?我需要列出整個文件夾路徑並使用單引號。

此代碼:

$Folder_To_Check = 'C:\Users\Sarah\Documents\AIU' 
$Report_File_Location = "File_Summary.txt" 

$results = Get-ChildItem $Folder_To_Check -Include *.doc,*.docx,*.xls,*.xlsx -Recurse 
$results | Group-Object extension | ForEach-Object { 
    [PSCustomObject]@{ 
     Results = $_.Name 
     Count = $_.Count 
     Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object - ExpandProperty Sum)/1MB,2) 
    } 
} | Out-File $Report_File_Location -Append 

BIG道具馬特幫我整理我的成績這麼好。謝謝你幫助我學習。

+0

我的答案中的一個編輯打破了我的代碼。如果您想再試一次,我會將其恢復到正常工作狀態。 – Matt 2014-10-18 12:37:38

回答

4
$Folder_To_Check = C:\AIU 
$Report_File_Location = "File_Summary.txt" 

$results = Get-ChildItem $Folder_To_Check -Include *.doc,*.docx,*.xls,*.xlsx -Recurse 
$results | Group-Object extension | ForEach-Object { 
    [PSCustomObject]@{ 
     Extension = $_.Name 
     Count = $_.Count 
     Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum)/1MB,2) 
    } 
} | Out-File $Report_File_Location -Append 

獲取的所有文件,你與Get-ChildItem就像你所期待的。 Vasja也提到,你也可以使用-Recurse來獲得子目錄的結果。使用Group-Object以擴展方式收集文件。對於每個集合,都會輸出擴展名和文件數的自定義對象,它們都是Group-Object,並且該特定擴展名的所有文件的大小都轉換爲MB並四捨五入爲小數點後兩位。

更新2.0

如果你只擁有2.0安裝我想提供,並回答了的作品。

$results | Group-Object extension | ForEach-Object { 
    $properties = @{ 
     Extension = $_.Name 
     Count = $_.Count 
     Size = [Math]::Round(($_.Group | Measure-Object -Sum Length | Select-Object -ExpandProperty Sum)/1MB,2) 
    } 
    New-Object -TypeName PSObject -Property $properties 
} 
+0

非常好,Matt – vasja 2014-10-17 21:26:26

+0

我是一個白癡,並在我的一個編輯中的回答中刪除了「Get-ChildItem」調用。 – Matt 2014-10-17 21:29:04

+0

@AnemonePoppy請再次嘗試我的代碼。如果它不起作用,那麼只需要2.0即可。 – Matt 2014-10-17 21:31:02

0

是的,你需要一個字符串集合的-Include參數。所以,你嘗試過什麼是一個字符串,這個生命:

"*doc, *docx, *xls, *xlsx" 

雖然逗號確實需要單獨的擴展,當你有它,它認爲這是的一兩件事,包括部分引號內,所以它的嚴重尋找有任何東西(如星號),然後是「doc」的文件,然後是「docx」,然後是任何東西,然後......你看到我要去的地方。它認爲它必須包括所有這些。相反,你需要一個字符串集合,如:

-Include "*doc","*docx","*xls","xlsx" 

我希望有所幫助。這裏是你的線修改爲應該工作的內容:

$files= Get-Childitem -Path $Folder_To_Check-Include "*doc", "*docx", "*xls", "*xlsx" 
+0

雖然你的觀點是有效的,但我沒有看到她原來的'-Include'的引號?似乎根據[TechNet]有效(http://technet.microsoft.com/en-ca/library/ee176841.aspx) – Matt 2014-10-17 18:50:53

+0

你是對的,她沒有他們,但確實說過她曾用引號圍繞整個事情。根據她的PS版本,我認爲舊版本在將它發送給提供者時會將整個事件解析爲一個字符串,除非您對如何構建它的方式非常明確。就我個人而言,我討厭FileSytem提供者的解析引擎,並且通常會嘗試使用Where子句在PS中進行過濾,除非它超長。 – TheMadTechnician 2014-10-17 18:53:44

+0

解析引擎非常糟糕。 – Matt 2014-10-17 18:54:12

2

添加了一些引號。 此外你可能想-RecurseGet-Childitem

$Folder_To_Check = "C:\AIU" 
$Report_File_Location = "E:\tmp\File_Summary.txt" 
$files = Get-Childitem -Path $Folder_To_Check -Include *doc, *docx, *xls, *xlsx -Recurse 

$files | Out-File $Report_File_Location 

$totalfiles = ($files | Measure-Object).Count 
$totalsize = ($files | Measure-Object -Sum Length).Sum 

write-host "totalfiles: $totalfiles" 
write-host "totalsize: $totalsize"