我需要能够列出根文件夹中不包含包含字符串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
答案 0 :(得分:4)
您可以使用Get-ChildItem
,Where-Object
和Select-String
:
Get-ChildItem -Directory |
Where-Object { -not (Get-ChildItem $_ -File -Recurse -Filter *merged*) } |
Select-Object Name, LastWriteTime
以下是对每行做什么的解释:
获取当前目录中的所有目录。
设置一个过滤器,在每个目录中递归搜索包含字符串merged
的文件名。只有在找不到目录时才传递目录。
获取每个目录的Name
和LastWriteTime
属性。
另请注意,如果您愿意,可以更简洁地编写:
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*
命令。如果命令失败,则时间戳和文件夹名称将回显到控制台。