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"}