文件名与正则表达式匹配但位于带通配符的文件夹中

Filenames matching regex but in folder with wildcard

这是以下问题的后续问题:

这段代码工作正常:

Get-ChildItem -Path "D:\Wim\TM1\TI processes" -Filter "*.vue" -Recurse -File |
    Where-Object { $_.BaseName -match '^[0-9]+$' } |
    ForEach-Object { ($_.FullName -split '\')[-2,-1] -join '\' } |
    Out-File D:\wim.txt

但我需要将搜索文件夹限制为仅某些文件夹,基本上,此过滤器:D:\Wim\TM1\TI processes\*}vues(因此所有以 }vues 结尾的子文件夹)。

如果我添加通配符条件,我将得不到任何结果。没有限制,我得到了正确的结果。请问这样可以吗?

我的想法是去掉第一个输出中的第 3 行(这是我 copy/paste 的),同时尽量减少要查看的文件夹数量。

您可以 嵌套 两个 Get-ChildItem 调用:

  • 外部 Get-ChildItem -Directory -Recurse 调用首先过滤感兴趣的 目录

  • 内部 Get-ChildItem -File 调用,对于找到的每个目录,检查并处理感兴趣的 文件

Get-ChildItem -Path "D:\Wim\TM1\TI processes" -Filter "*}vues" -Recurse -Directory |
  ForEach-Object {
    Get-ChildItem -LiteralPath $_.FullName -Filter "*.vue" -File | 
      Where-Object { $_.BaseName -match '^[0-9]+$' } | 
        ForEach-Object { ($_.FullName -split '\')[-2,-1] -join '\' }                 
  } | Out-File D:\wim.txt

注意:假设所有 *.vue 个感兴趣的文件都直接 位于每个 *}vues 文件夹中。


至于你试过的

鉴于您将枚举的项目限制为 文件 (-File),您的目录名称通配符模式 *}vues 永远不会匹配任何目录 名称,如果没有 文件 匹配该模式,returns

一般来说,-Recurse 在概念上更清晰 而不是 将通配符模式直接附加到 -Path 参数,以便更好地表明模式将在子树中的 每个 目录中匹配。

在你的情况下,你会注意到你试图双重过滤,假设你使用-Filter参数。