Powershell: исключить множество папок с оператором -notmatch

Я создаю небольшой скрипт, который будет перечислять EXE-файлы на компьютере.

$computername = get-content env:computername
get-childitem C: -recurse | ? {$_.fullname -notmatch 'C:\\Windows'} | where {$_.extension -eq ".exe"} | format-table fullname | Out-File "\\server\incomming\$computername.txt"

Проблема в том, что -notmatch не принимает больше утверждений. Я мог бы скопировать и вставить ? {$_.fullname -notmatch 'C:\\Windows'} и использовать для других папок, таких как Program Files (x86), Program Files и так далее. Но я не хотел бы слишком раздувать сценарий.

Есть ли способ исключить многочисленные папки с помощью оператора -notmatch?

3 ответа

Решение

Вы можете использовать логические операторы, такие как -and для более сложных логических выражений.

Get-ChildItem C:\ -Recurse | Where-Object { ($_.FullName -notmatch "C:\\Windows") -and ($_.FullName -notmatch "C:\\Program Files") }   

Для многих путей я бы добавил их в массив или хеш-таблицу перед вызовом Get-ChildItem и использовать Where-Object проверьте, присутствует ли путь к объекту файла конвейера в массиве или хэш-таблице. В конце концов, вы должны где-то перечислить пути, но не обязательно в одной команде. Например:

$excludedPaths = @("C:\Windows", "C:\Program Files");
Get-ChildItem C:\ -Recurse | Where-Object { $excludedPaths -notcontains $_.Directory }

Спасибо за ответы!

И возможно ли получить вывод дольше, чем сейчас?

Теперь это что-то вроде 100 символов, а затем оно заканчивается точками, если путь длиннее этого. Я получил что-то вроде этого - C:\ мои файлы \ мои программы \ прог...

Я бы использовал что-то вроде этого:

get-childitem -literalpath e:\*.exe -Recurse | where { $_.DirectoryName -notmatch "Windows" -and $_.DirectoryName -notmatch "MyOtherFiles"}
Другие вопросы по тегам