Как исключить определенные папки из поиска файлов, если поиск производится по заданной маске?

Как правильно настроить скрипт PowerShell для рекурсивного поиска файлов с расширением .exe, исключающий из результатов папки Windows и 123? В настоящее время используется следующий скрипт, который не работает должным образом:

```powershell
Get-ChildItem -Path C:\* -Recurse -Force -Exclude windows,123 -Filter *.exe | out-file C:\123\poisk.txt
```
  • 5 декабря 2023 г. 10:50
Ответы на вопрос 1
Чтобы исключить определенные папки из поиска в PowerShell, можно использовать комбинацию Get-ChildItem для получения элементов и Where-Object для фильтрации путей, которые не должны учитываться.

Проблема с параметром `-Exclude` заключается в том, что он применяется ко всем элементам в результате, не только к папкам. Также он смотрит только на имена, без учета пути, и трудно предсказать его поведение в сочетании с `-Recurse`.

Вот пример скрипта PowerShell, который рекурсивно ищет файлы с расширением .exe, исключая папки `Windows` и `123`:

```powershell
$excludedFolders = @('C:\Windows', 'C:\123') # задаем папки для исключения

# Получаем все файлы .exe, за исключением тех, что лежат в исключенных папках
Get-ChildItem -Path C:\ -Recurse -Force -File -Filter *.exe |
    Where-Object { 
        # Проверяем, что полный путь (FullName) файла не начинается с одного из путей исключенных папок
        $fullPath = $_.FullName
        -not ($excludedFolders | Where-Object { $fullPath -like "$_*" })
    } |
    Out-File -FilePath C:\123\poisk.txt
```

В этом примере используется `Where-Object` для фильтрации файлов, путь которых не начинается с путей, указанных в `$excludedFolders`. Стоит обратить особое внимание на правильность составления путей в `$excludedFolders`, так как они должны быть точными и соответствовать тем папкам, которые вам нужно исключить.

Этот метод хорошо работает, если у вас есть конкретный список папок для исключения. Если же названия исключаемых папок могут встречаться в разных местах в структуре каталогов и вы хотите исключить их все, то скрипт надо немного усложнить:

```powershell
Get-ChildItem -Path C:\ -Recurse -Force -File -Filter *.exe |
    Where-Object { 
        # Проверяем, что ни один из родительских путей не содержит исключенных имен папок
        $parent = $_.Directory
        while ($parent -ne $null) {
            if ($parent.Name -eq 'Windows' -or $parent.Name -eq '123') {
                return $false
            }
            $parent = $parent.Parent
        }
        return $true
    } |
    Out-File -FilePath C:\123\poisk.txt
```

Этот второй пример включает проверку каждой папки в иерархии пути файла с целью исключения всех файлов, родительская директория которых содержит имя 'Windows' или '123'.
Похожие вопросы