Powershell PS脚本,用于打印目录名(如果文件类型在其中)
我正在寻找一个PS脚本,用于检查文件夹子文件夹(深度-1)中的特定文件类型(.err),如果它找到至少一个具有所需文件类型的文件,则只打印子文件夹的名称,而不打印文件修补程序或文件名,例如: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
[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
将匹配文件的目录名作为数组输出(通过PSv3+).Directory.Name
清除重复项,这是必要的,因为给定目录如果包含多个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