2014-10-13 1 views
2

Я создаю небольшой скрипт, который будет отображать EXE-файлы на компьютере.Powershell: Исключить многочисленные папки с помощью инструкции -notmatch

$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?

ответ

5

Для более сложных логических выражений вы можете использовать логические операторы, такие как -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 } 
0

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

get-childitem -literalpath e:\*.exe -Recurse | where { $_.DirectoryName -notmatch "Windows" -and $_.DirectoryName -notmatch "MyOtherFiles"} 
+0

'$ _. DirectoryName' нехорошо, вы все равно получите совпадения для файлов, например. '\ Windows \ System32' –

+0

DirectoryName - это только папка с элементами в формате String, если вы хотите, чтобы вы были точнее, хотите заменить -notmatch на -ne и указать имя папки, то есть $ _. DirectoryName -ne" e: \ windows " –

0

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

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

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

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^