Powershell PS脚本,用于打印目录名(如果文件类型在其中)

Powershell PS脚本,用于打印目录名(如果文件类型在其中),powershell,Powershell,我正在寻找一个PS脚本,用于检查文件夹子文件夹(深度-1)中的特定文件类型(.err),如果它找到至少一个具有所需文件类型的文件,则只打印子文件夹的名称,而不打印文件修补程序或文件名,例如: [root folder] [subfolder1]-has .err in it [subfolder2]-doesn't have .err in it [subfolder3]-doesn't have .err in it [subfolder4]-has .err in it [subfolder

我正在寻找一个PS脚本,用于检查文件夹子文件夹(深度-1)中的特定文件类型(.err),如果它找到至少一个具有所需文件类型的文件,则只打印子文件夹的名称,而不打印文件修补程序或文件名,例如:

[root folder]
[subfolder1]-has .err in it
[subfolder2]-doesn't have .err in it
[subfolder3]-doesn't have .err in it
[subfolder4]-has .err in it
[subfolder5]-has .err in it
输出:

[subfolder1]
[subfolder4]
[subfolder5]
我不擅长PowerShell,所以我只知道如何列出其中包含.err文件的子文件夹名称的次数与其中包含文件的次数相同

(Get-ChildItem -Path C:\root -Depth 1 -recurse -filter *.err).DirectoryName | echo

如果我正确理解了问题,这应该满足您的要求:

Get-ChildItem -Path 'C:\Root' -Depth 1 -Recurse -Filter *.err -File | 
    Group-Object -Property DirectoryName | 
    ForEach-Object { ($_.Name -split '\\')[-1] }
它在子文件夹中搜索1级深度,如果找到扩展名为
.err
的文件(无论该文件夹中有多少文件),则只输出一次子文件夹名称

如果您使用的是低于3.0的PowerShell版本,请将顶行更改为
getchilditem-Path'C:\Root'-Depth 1-Recurse-Filter*.err|
其中对象{!$.PSIsContainer}

更新:是最简单的方法


请尝试以下操作:

(Get-ChildItem -Depth 1 -Filter *.err).Directory.Name | Get-Unique | Select -Skip 1
为简洁起见,我省略了
-Path
参数以及限制文件匹配的
-File
开关,因为可以公平地假设您没有任何名为
*.err
的目录

  • 使用
    -Depth
    意味着使用
    -Recurse
    ,因此无需指定后者

  • .Directory.Name
    将匹配文件的目录名作为数组输出(通过PSv3+)

  • Get Unique
    清除重复项,这是必要的,因为给定目录如果包含多个
    *.err
    文件,将被多次输出

  • Select-Skip 1
    Select
    Select Object
    的内置别名)跳过第一个输出对象,因为它表示输入目录本身(深度
    0


    • 好的,在@mklement0的指导下,我的建议是

      (Get-ChildItem (C:\root + "\*\*") -Filter "*.err").Directory.Name | select -Unique
      

      非常感谢。这是一个诡辩,因为性能差异在这里可能无关紧要,但作为一个一般的关注点:
      Get Unique
      假设预先排序的输入(或者至少重复的输入要分组,如本例所示),这使得它比必须查看整个输入集合的
      Select Object-Unique
      快得多。因此,除了将
      -Filter
      参数拉入通配符路径之外,我认为最好的公式最终是:
      (Get ChildItem“C:\root\*\*.err”).Directory.Name|Get Unique