【问题标题】:Powershell SearchPowershell 搜索
【发布时间】:2014-12-13 09:23:55
【问题描述】:

这是我想要做的:

  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,这会给我每种类型的文件总数?

更新 感谢这里的人的帮助,我的代码可以正常工作。但是我遇到了一个问题,它说我的文件不存在。问题?我需要列出整个文件夹路径并使用单引号。

此代码有效:

$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

感谢 Matt 帮助我组织我的结果非常好。感谢您帮助我学习。

【问题讨论】:

  • 我的回答中的一个编辑破坏了我的代码。如果您想再试一次,我已将其恢复到正常工作状态。

标签: powershell output


【解决方案1】:
$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 位。

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
}

【讨论】:

  • 我是个白痴,在我的一个编辑中删除了我的答案中的Get-ChildItem 调用。
  • @AnemonePoppy 请再试一次我的代码。如果它不起作用,请查看 2.0 答案,因为您只有 2.0。
  • @马特。我将您的答案标记为正确答案,因为它是最有帮助的。我仍然遇到问题,因为 PS 说我的 C:file 不存在,我不知道该怎么办;但至少递归是有效的。
  • @AnemonePoppy 我不记得你在任何地方提到过这个问题。您可以更新您的问题或开始一个新问题吗?
  • @Matt 我想通了,我知道它是如此愚蠢和渺小。我需要列出整个路径并使用单引号。摆弄它终于给了我想要的结果。在最新更新中向您提供所有帮助 :)
【解决方案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"

【讨论】:

    【解决方案3】:

    是的,您需要一个用于 -Include 参数的字符串集合。所以,你尝试的是一个字符串,即:

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

    虽然当您将逗号包含在引号中时,逗号确实需要分隔扩展名,但它认为这是要包含的一件事的一部分,因此它正在认真寻找包含任何内容(根据星号)然后是“doc, ” 然后是任何东西然后是“docx”,然后是任何东西......你知道我要去哪里。它认为它必须包括所有这些。相反,您需要一组字符串,例如:

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

    我希望这会有所帮助。这是你的行修改为应该工作的内容:

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

    【讨论】:

    • 虽然你的观点是有效的,但我没有看到她原来的 -Include 周围的引号?根据TechNet 似乎有效
    • 是的,她没有,但她确实说过她已经尝试过,并在整个过程中加上引号。根据她的 PS 版本,我认为旧版本在将整个内容发送给提供者时会将其解析为字符串,除非您非常明确地说明了如何构建它。就我个人而言,我讨厌 FileSytem Provider 的解析引擎,并且通常会尝试在 PS 中使用 Where 子句进行过滤,除非它需要很长时间。
    • 解析引擎很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2017-12-18
    • 2017-04-13
    • 2012-12-04
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多