2016-04-14 51 views
1

我正在参加适合初学者的PowerShell课程,并且在请求帮助时,讲师完全没用。我正在尝试执行的任务是:在计算机中搜索以.doc,.docx,.xls或.xlsx文件扩展名结尾的文件。 将文件名和大小(按文件扩展名分组)输出到名为“File_Summary.txt”的文本文件。输出结果还应包含每个文件扩展名的文件总数和文件总大小。我迄今为止创建的代码是:每个分机的Powershell计数文件扩展名和总文件大小

$path = ".\" 
$destination = "C:\Users\StayPositibve\Desktop\pleasework1.txt" 

$results = Get-ChildItem .\* -Recurse | where {$_.extension -in ".doc",".docx",".xls",".xlsx"} | Select-Object Name, Extension, @{Name="Kbytes";Expression={ "{0:N0}" -f ($_.Length/1Kb) }} 
$results | Sort-Object -Property extension | Out-File $destination 
$countFiles = Get-ChildItem .\* -Recurse | where {$_.extension -in ".doc",".docx",".xls",".xlsx"} 
$countFiles | Group-Object -Property extension | Out-File $destination -Append 

该代码运行(尽管我确定它是可怕的编码);但是,我无法弄清楚如何将每个扩展的总文件大小加在一起。我有每个扩展的文件总数,但不是总大小。感谢任何人都可以给我的帮助!

+0

我不认为你有一个没有循环的整洁选项;我能想到的最干净的就是使用'Group-Object -Property Extension'并将其存储在一个变量中,然后使用'$ store | ForEach {$ _。Name; $ _。Group |测量对象-Sum-属性长度|选择-ExpandProperty Sum}'并查看它的作用,并将其附加到文件中。 (我也建议你在做任何事情之前先存储基本Get-ChildItem调用的结果,然后你可以重新使用结果,而不必等待它再次搜索文件数)。 – TessellatingHeckler

回答

1

您想按照TessellatingHeckler的建议使用Measure-Object。这将你所要完成的是什么:

$path = ".\" 
$destination = "C:\Users\StayPositibve\Desktop\pleasework1.txt" 

$results = Get-ChildItem .\* -Recurse | where {$_.extension -in ".doc",".docx",".xls",".xlsx"} | Select-Object Name, Extension, @{Name="Kbytes";Expression={ "{0:N0}" -f ($_.Length/1Kb) }} 
$results | Sort-Object -Property extension | Out-File $destination 
$results|group extension|select Count,Name,@{l='Total KB';e={$_.Group | Measure-Object -Property kbytes -Sum|select -expand sum}}| Out-File $destination -Append 

我再次使用$results,像您这样的组做了,但是后来我用Select添加新的特性,其中我与Measure-Object每个分组的总大小管道到Select -Expand Sum

+0

感谢TheMadTechnician和TessellatingHeckler的帮助。看看你的代码,我可以看到我创建了两个变量,它们完成了相同的过程,而不是只使用$结果。我是新来的,所以我很高兴我慢慢到达那里。再次感谢! –

相关问题