I need to be able to list all of the directories in a root folder that do not contain a file which contains the string merged
. So for example, if I run the script from the directory C:\out
, I will get a list of all the folders inside of C:\out
which do not match the wildcard merged
.
Example:
Tree:
-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
Output:
test789
test013
You can use Get-ChildItem
, Where-Object
, and Select-String
:
Get-ChildItem -Directory |
Where-Object { -not (Get-ChildItem $_ -File -Recurse -Filter *merged*) } |
Select-Object Name, LastWriteTime
Below is an explanation of what each line does:
Get all directories in the current directory.
Set up a filter that searches recursively through each directory for file names that contain the string merged
. Only pass on the directory if none are found.
Get the Name
and LastWriteTime
attributes of each directory.
Note too that you can write it more concisely if you want:
gci -dir | ? { !(gci $_ -file -recur -filter *merged*) } | select name, *w*time