列出所有不包含带通配符的文件的目录

时间:2014-07-09 18:59:55

标签: powershell filesystems wildcard directory-structure

我需要能够列出根文件夹中不包含包含字符串merged的文件的所有目录。例如,如果我从目录C:\out运行脚本,我将获得C:\out内与通配符merged不匹配的所有文件夹的列表。

示例:

-c:\out
--c:\out\test123
---sample.meta
---sample_merged.meta
--c:\out\test456
---sample.meta
---sample_merged.meta
--c:\out\test789
---sample.meta
--c:\out\test013
---sample.meta

输出:

test789
test013

3 个答案:

答案 0 :(得分:4)

您可以使用Get-ChildItemWhere-ObjectSelect-String

Get-ChildItem -Directory |
Where-Object { -not (Get-ChildItem $_ -File -Recurse -Filter *merged*) } |
Select-Object Name, LastWriteTime

以下是对每行做什么的解释:

  1. 获取当前目录中的所有目录。

  2. 设置一个过滤器,在每个目录中递归搜索包含字符串merged的文件名。只有在找不到目录时才传递目录。

  3. 获取每个目录的NameLastWriteTime属性。

  4. 另请注意,如果您愿意,可以更简洁地编写:

    gci -dir | ? { !(gci $_ -file -recur -filter *merged*) } | select name, *w*time
    

答案 1 :(得分:0)

拉出目标的目录列表,然后针对目标文件夹的列表进行过滤,使其不包含您要过滤的文件。

$BaseDir = "C:\out"
$FilterFile = "sample_merged.meta"
GCI $BaseDir -Directory | ?{!(GCI $_.FullName | Select -Expand Name) -Contains $FilterFile}|Select -Expand Name

这应该给你想要的输出。将最后Name更改为FullName以获取整个路径,而不仅仅是文件夹名称。

答案 2 :(得分:0)

批量版

@echo off

    setlocal enableextensions
    for /d %%a in ("c:\out\*") do (
        dir /b /a-d "%%~fa\*merged*" >nul 2>nul || echo %%~ta %%~nxa
    )

它简单地迭代c:\out内的文件夹,并为每个文件夹执行dir文件的*merged*命令。如果命令失败,则时间戳和文件夹名称将回显到控制台。