Count不适用于-include jpg

时间:2017-02-23 13:12:01

标签: powershell scripting powershell-v4.0

我有以下脚本:

$Extension = "*.jpg"
Get-ChildItem -Path 'C:\Users\DAVID\Documents\Test' -Directory | ForEach-Object {
    $FilesInFolder = @($_ | Get-ChildItem -Recurse -Include $Extension -File -Force)

    $FileSize = $FilesInFolder | Measure-Object -Property Length -Sum |
                Select -ExpandProperty Sum
    $FileSize = "{0:N2}" -f ($FileSize/1MB) + " MB"

    $NumFiles = $FilesInFolder.Count
}

但它总是计算文件夹中包含.zip文件和.exe的所有内容。 我在这做错了什么?我怎样才能让它只计算.jpg文件。找不到任何解决方案,但我认为它有这方面的事情要做:

$FilesInFolder = @($_ | Get-ChildItem -Recurse -Include $Extension -File -Force)

2 个答案:

答案 0 :(得分:2)

我无法完全解释这一点,因为文档在这个问题上有点不清楚,但你的怀疑是正确的。您至少有两种简单的方法可以获得正确的结果:

  1. 使用-Filter代替-Include

    $FilesInFolder = @($_ | Get-ChildItem -Recurse -Filter $Extension -File -Force)
    
  2. 显式指定路径而不是使用输入对象

    $FilesInFolder = @(Get-ChildItem -Path $_.FullName -Recurse -Include $Extension -File -Force)
    
  3. 特别是第二个版本让我觉得这可能是Get-ChildItem

    中的一个错误(或者至少是非常奇怪的行为)

答案 1 :(得分:1)

我认为问题是$ _ | Get-ChildItem不会导致将对象的路径传递给Path属性(因为$ _而是具有名为PSPath的属性)。

然而,这似乎有效:

$Extension = "*.jpg"

Get-ChildItem -Path 'C:\Users\ab73541\Documents\' -Directory | ForEach-Object {

$FilesInFolder = @(Get-ChildItem $_.PSPath -Recurse -Include $Extension -File -Force)

$FileSize = $FilesInFolder | Measure-Object -property length -Sum | Select -ExpandProperty Sum
$FileSize = "{0:N2}" -f ($FileSize/1MB) + " MB"

$NumFiles = $FilesInFolder.Count }