问题
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
回答1:
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
NameandLastWriteTimeattributes 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
回答2:
Pull a directory listing for the target, then filter against a listing of the target folder to not contain the file you're filtering for.
$BaseDir = "C:\out"
$FilterFile = "sample_merged.meta"
GCI $BaseDir -Directory | ?{!(GCI $_.FullName | Select -Expand Name) -Contains $FilterFile}|Select -Expand Name
That should give you the desired output. Change the last Name to FullName to get the entire path, not just the folder name.
回答3:
For a batch version
@echo off
setlocal enableextensions
for /d %%a in ("c:\out\*") do (
dir /b /a-d "%%~fa\*merged*" >nul 2>nul || echo %%~ta %%~nxa
)
It simple iterates the folders inside c:\out, and for each of them a dir command for a *merged* file is executed. If the command fails the timestamp and name of folder is echoed to console.
来源:https://stackoverflow.com/questions/24661751/list-all-directories-that-do-not-contain-a-file-with-wildcard-match