Recursive -notmatch in get-childitem with regex
I am trying to find some files with set extensions with the following code.
$include = @('*.keystore', '*.cer', '*crt', '*pfx', '*jks', '*.ks')
$exclude = [RegEx]'^C:\\Windows|^C:\\Program Files|^C:\\Documents and Settings|^C:\\Users|\bBackup\b|\bbackup\b|\brelease\b|\breleases\b|\bReleases\b|\bRelease\b'
$trace="trace.txt"
Get-ChildItem "D:\","C:\" -Directory |
where FullName -notmatch $exclude | ForEach {
Get-ChildItem -Path $_.FullName -Include $include -Recurse -Force -EA 0|
Select-Object -ExpandProperty FullName
} *>&1 >> $trace
It works but only excludes if the root directory contains one of the patterns. Ex. Excludes D:\Backup but includes D:\something\Backup
Is there a way to exclude the second folder as well?
CodePudding user response:
Try this with a single call to Get-ChildItem
and have it look for files. Then in the Where-Object
clause, you filter on the DirectoryName to exclude the folders you don't want in the output.
Also, you can simplify your regex and use it case-insensitively.
Try:
$include = '*.keystore', '*.cer', '*.crt', '*.pfx', '*.jks', '*.ks'
$exclude = '^C:\\(Windows|Program Files|Documents and Settings|Users)|\bBackup\b|\breleases?\b'
$trace = 'trace.txt'
Get-ChildItem -Path 'C:\','D:\' -File -Include $include -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { $_.DirectoryName -notmatch $exclude } |
Select-Object -ExpandProperty FullName |
Set-Content -Path $trace -PassThru
Switch -PassThru
makes the result also display on screen
The C:\
drive contains system-defined junction points you do not have access to, even when running as admin.
Based on this answer, you can change the code to:
$include = '*.keystore', '*.cer', '*.crt', '*.pfx', '*.jks', '*.ks'
$exclude = '^C:\\(Windows|Program Files|Documents and Settings|Users)|\bBackup\b|\breleases?\b'
$trace = 'trace.txt'
Get-ChildItem -Path 'C:\','D:\' -File -Include $include -Force -Recurse -Attributes !Hidden, !System, !ReparsePoint -ErrorAction SilentlyContinue |
Where-Object { $_.DirectoryName -notmatch $exclude } |
Select-Object -ExpandProperty FullName |
Set-Content -Path $trace -PassThru