Перейти к основному контенту
Центр разработки для Windows

 none
Использование массива Exclude RRS feed

  • Вопрос

  • Доброго дня.

    Никак не могу разобраться с одной проблемой.

    Нужно выполнить поиск файлов по папкам, но некоторые папки из поиска надо исключить.

    Собственно, делаю так:

    $Search = Get-ChildItem ($Path) -Exclude $ExcludeFolders

    Затык в том, что $ExcludeFolders - это массив неполного пути к файлу. Начало пути определяется чуть раньше - это удаленного компьютера и диск. То есть начало динамическое = "\\computer\c$","\\computer\d$" и т.д., а $ExcludeFolders = "\windows\","program files" и т.д.

    Пробовал использовать ForEach, но тогда в $ExcludeFolders добавляется длинная строка, а не массив.

    Делал 

    $ExcludeFolders_inSeacrh += @($Path+$ExcludeFolders) - не исключаются папки из Get-ChildItem...

    Запутался, помогите плиз

    21 января 2020 г. 13:51

Ответы

  • замените строку

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders -Recurse -Depth 3

    На

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders | Get-ChildItem -Recurse -Depth 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Помечено в качестве ответа atulyakov 22 января 2020 г. 11:18
    22 января 2020 г. 9:16
  • Берём обекты из корня диска, отфильтровывая по Exclude и передаём по конвееру для получения дочерних объектов с глубиной вложенности 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Помечено в качестве ответа atulyakov 22 января 2020 г. 11:18
    22 января 2020 г. 10:30

Все ответы

  • ничего не понял про "определено выше/ниже"

    что конкретно у вас находится в $excludeFolders?


    The opinion expressed by me is not an official position of Microsoft

    21 января 2020 г. 14:01
    Модератор
  • День добрый.

    Все работает штатно:

    $Path = '\\s-kor-hp\c$','\\s-kor-w10-pro\c$'
    
    $ExcludeFolders = "Windows","Program Files (x86)"
    
    (Get-ChildItem -Path $Path).count
    (Get-ChildItem -Path $Path -Exclude $ExcludeFolders).count

    Результат:

    24
    20

    Вы случайно не в vscod это дебажите? Если да попробуйте в ISE


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Помечено в качестве ответа atulyakov 22 января 2020 г. 4:44
    • Снята пометка об ответе atulyakov 22 января 2020 г. 5:10
    21 января 2020 г. 15:26
  • День добрый.

    Все работает штатно:

    $Path = '\\s-kor-hp\c$','\\s-kor-w10-pro\c$'
    
    $ExcludeFolders = "Windows","Program Files (x86)"
    
    (Get-ChildItem -Path $Path).count
    (Get-ChildItem -Path $Path -Exclude $ExcludeFolders).count

    Результат:

    24
    20

    Вы случайно не в vscod это дебажите? Если да попробуйте в ISE


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    Ох, черт, в -Exclude можно запихивать не полный путь, а прям имя папки и оно работает? Круто! Не знал, спасибо!

    Если добавить -Recurse, то -Exclude перестает работать.

    • Изменено atulyakov 22 января 2020 г. 5:10
    22 января 2020 г. 4:44

  • Если добавить -Recurse, то -Exclude перестает работать.

    Опишите, пожалуйста, задачу полностью, желательно с примером вашего кода. Так будет легче сориентироваться.

    Возможно вам подойдёт фильтрация уже в конвеере, пример: https://stackoverflow.com/questions/15294836/how-can-i-exclude-multiple-folders-using-get-childitem-exclude


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram


    22 января 2020 г. 5:15
  • ничего не понял про "определено выше/ниже"

    что конкретно у вас находится в $excludeFolders?


    The opinion expressed by me is not an official position of Microsoft

    Нужно найти файлы по определенной маске на всех компьютерах. ОС на них - от win xp до 10. Поэтому решил выполнять запрос с одного компьютера по всем дискам удаленных компьютеров. Из поиска надо исключить стандартные папки Windos: C:\windows, c:\program files и т.д. Так как обращаюсь удаленно, то начало пути до папки - динамическое: \\comp1\c$, \\comp2\c$ и т.д. Нужно внести эти папки исключения из выборки. Пытаюсь это сделать через -Exclude.
    22 января 2020 г. 6:10
  • тогда пример по предыдущей ссылке:

    Get-ChildItem -Exclude folder1,folder2 | Get-ChildItem -Recurse | ...
    


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    22 января 2020 г. 6:13
  • тогда пример по предыдущей ссылке:

    Get-ChildItem -Exclude folder1,folder2 | Get-ChildItem -Recurse | ...


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    Затык как раз в корректной передаче массива folder1,folder2
    22 января 2020 г. 7:35

  • Затык как раз в корректной передаче массива folder1,folder2
    в чем конкретно проблема? вам показали рабочий пример, как раз под ваше тз

    The opinion expressed by me is not an official position of Microsoft

    22 января 2020 г. 8:37
    Модератор

  • Затык как раз в корректной передаче массива folder1,folder2

    в чем конкретно проблема? вам показали рабочий пример, как раз под ваше тз

    The opinion expressed by me is not an official position of Microsoft

    У меня начало пути до папки меняется.

    Вот код

    $ComputersFile = $WorkFolder + "computers.txt"
    $ExcludeFoldersFile = $WorkFolder + "excludefolders.txt"
    $FileNameMasksFile = $WorkFolder + "searchmask.txt"
    
    $Computers = Get-Content $ComputersFile
    $ExcludeFolders = Get-Content $ExcludeFoldersFile
    $FileNameMasks = Get-Content $FileNameMasksFile
    
    $LogFile = $WorkFolder + "log.txt"
    
    $Disks = "c","d","e"
    
    "Get started at " + (Get-Date -Format yyyy.MM.dd_HH:mm:ss)  | Out-File $LogFile
    
    ForEach ($Computer in $Computers)
        {
        ForEach ($Disk in $Disks)
            {
            $TestDisk = $null
            $TestDisk = "\\"+$Computer+"\"+$Disk+"$\"
            if ((Test-Path $TestDisk) -eq "true")
                {
                "Проверяем путь" + $TestDisk
                "Проверяем путь" + $TestDisk | Out-File $LogFile -Append
                ForEach ($FileNameMask in $FileNameMasks)
                    {
                    $SearchMassive = $null
                    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders -Recurse -Depth 3
                    ForEach ($File in $SearchMassive)
                        {
                        try
                            {
                            $TestDisk+$File.Name
                            }
                        catch [System.UnauthorizedAccessException]
                            {
                            $TestDisk+$File.Name + " попытка доступа не удалась - отказано в доступе."
                            $TestDisk+$File.Name + " попытка доступа не удалась - отказано в доступе." | Out-File $LogFile -Append
                            }
                        }
                    }
            
                }
            }
        }


    В логе работы отхватываю предупреждения 

    Get-ChildItem : Отказано в доступе по пути "\\compname\c$\Program Files (x86)\Google\CrashReports".

    Хотя содержимое файла $ExcludeFoldersFile :

    windows
    program files
    program files (x86)

    • Изменено atulyakov 22 января 2020 г. 9:01
    22 января 2020 г. 8:59
  • замените строку

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders -Recurse -Depth 3

    На

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders | Get-ChildItem -Recurse -Depth 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Помечено в качестве ответа atulyakov 22 января 2020 г. 11:18
    22 января 2020 г. 9:16
  • замените строку

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders -Recurse -Depth 3

    На

    $SearchMassive = Get-ChildItem ($TestDisk) -Exclude $ExcludeFolders | Get-ChildItem -Recurse -Depth 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    Стало работать шустрее и корректнее. Подскажите, как работает конвеер в таком случае? Сначала получаем список всех файлов, а потом берем из них не глубже 3 уровня?
    22 января 2020 г. 9:25
  • Берём обекты из корня диска, отфильтровывая по Exclude и передаём по конвееру для получения дочерних объектов с глубиной вложенности 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    • Помечено в качестве ответа atulyakov 22 января 2020 г. 11:18
    22 января 2020 г. 10:30
  • Берём обекты из корня диска, отфильтровывая по Exclude и передаём по конвееру для получения дочерних объектов с глубиной вложенности 3


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram

    Понял, спасибо!
    22 января 2020 г. 11:18