【问题标题】:Powershell - List subdirectories and count files per subdirectoryPowershell - 列出子目录并计算每个子目录的文件
【发布时间】:2014-12-06 20:44:17
【问题描述】:

我有一个充满子目录的目录,其中包含任意数量的 0 到 300 个文件。

我要输出子目录名和子目录中的文件数

到目前为止,无论子目录中有多少实际文件,我都给我 0。

$dir = "C:\Folder\" 
$subFiles = (Get-ChildItem $dir -recurse | where-object {$_.PSIsContainer -eq $true })
$subFiles | % {
Get-ChildItem -Path $_ -Force -Recurse | Measure-Object | Select-Object -ExpandProperty Count
write-host "$_"
}

它有时还包括运行脚本的目录,即“C:\Users\Blah\documents and settings\startmen”并导致错误。

非常感谢您的帮助

【问题讨论】:

    标签: file powershell directory powershell-3.0 powershell-ise


    【解决方案1】:

    这正是我想要的 :) 它不是很漂亮,但它有效..

    $dir = "C:\folder\"
    $subFiles = (Get-ChildItem $dir -recurse | where-object {$_.PSIsContainer -eq $true })
    $subFiles | % {
    $path = $dir+$_
    $files = Get-ChildItem -Path $path -Force -Recurse -File -ErrorAction SilentlyContinue
    write-host "$_ Files:" $files.count
    }
    

    【讨论】:

      【解决方案2】:

      您至少使用 PowerShell 3.0,因为您使用的是 Get-ChildItem-File 参数,因此您不需要使用 where-object {$_.PSIsContainer -eq $true }。这已被 -Directory 参数替换。遍历所有文件夹并收集文件夹名称和文件数量。我删除了文件计数的-Recurse,因为这可能会产生误导。如果它更适合你,就把它放回去。最后的Select-Object 是为了确保输出的顺序,这是一个对象,现在你可以排序或做任何你想做的事情。

      $dir = "C:\File" 
      Get-ChildItem $dir -Recurse -Directory | ForEach-Object{
          [pscustomobject]@{
              Folder = $_.FullName
              Count = @(Get-ChildItem -Path $_.Fullname -File).Count
          }
      } | Select-Object Folder,Count
      

      洞察力

      您之前遇到过这些错误,因为您没有在 Get-ChildItem 中调用完整路径,您只是在调用文件夹名称。在没有完整路径的情况下,Get-ChildItem 假定您正在当前目录中查找文件夹。这通常是您的用户目录。

      【讨论】:

      • 嗨,马特。您是否有机会修改脚本以仅将子文件夹包含在提供的路径中?
      • @mrjayviper 这很简单。只需使用Get-ChildItem-Depth 参数
      • 我尝试在示例脚本中的第一个和第二个 gci 上使用“-depth 1”(也尝试过 2),与原始脚本没有区别。
      • @mrjayviper 也许我理解错了,但您可能只需要删除-Recurse 吗?那应该只处理直接子文件夹。
      • 示例:parent1(最顶层文件夹)有 3 个子文件夹(subfolder1 subfolder2 和 subfolder3)。在 subfolder1 到 3 内有更多的文件夹和文件。我想显示 subfolder1 到 3 中的文件数。我尝试不使用 -recurse,它给了我在路径下方的所有子文件夹的计数为 0。
      【解决方案3】:

      这种计数方法对于远程目录来说似乎更快。

      $count = [System.IO.Directory]::GetFiles($_.Fullname).Count
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-23
        • 2015-06-28
        • 2012-09-02
        • 2016-03-11
        • 2012-12-25
        相关资源
        最近更新 更多