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?


person Phoneutria    schedule 13.10.2014    source источник


Ответы (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 }
person PeterK    schedule 13.10.2014

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

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

Теперь это что-то вроде 100 символов, а затем оно заканчивается точками, если путь длиннее этого. У меня получилось что-то вроде этого - C:\my files\myprograms\prog...

person Phoneutria    schedule 14.10.2014
comment
PowerShell делает это, чтобы сделать вывод читаемым при форматировании таблицы. Вы всегда можете сохранить результаты в файл (например, | Export-Csv) или использовать | Format-List, который будет разрывать строки вместо добавления эллипсов. | Select-Object -Property FullName | Format-List вернет только имена файлов. - person PeterK; 16.10.2014

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

get-childitem -literalpath e:\*.exe -Recurse | where { $_.DirectoryName -notmatch "Windows" -and $_.DirectoryName -notmatch "MyOtherFiles"}
person Micky Balladelli    schedule 13.10.2014
comment
$_.DirectoryName не годится, вы все равно получите совпадения для файлов, например. \Windows\System32 - person Mathias R. Jessen; 13.10.2014
comment
DirectoryName — это просто папка элемента в формате String, если вы хотите быть точным, вы хотите заменить -notmatch на -ne и указать имя папки по буквам, то есть $_.DirectoryName -ne e:\windows - person Micky Balladelli; 13.10.2014