Использование Get-ChildItem -Exclude или -Include ничего не возвращает

У меня есть список в моем C: каталоге, который имеет много файлов. Если я попытаюсь запустить -Exclude для него, я не получу возврата. То же самое с -Include. Если я использую фильтр, он возвращает то, что я ожидал получить обратно. Я не понимаю, что он должен делать?

Вот пример того, что я бегу и ничего не получаю:

Get-ChildItem -Path C: -Exclude "*.txt"

Я ничего не получаю обратно. Если я бегу

Get-Childitem -filter "*.txt"

Я получаю это обратно:

  Mode                LastWriteTime         Length Name                                                                               
----                -------------         ------ ----                                                                               
-a----        11/7/2007   8:00 AM          17734 eula.1028.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1031.txt                                                                      
-a----        11/7/2007   8:00 AM          10134 eula.1033.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1036.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1040.txt                                                                      
-a----        11/7/2007   8:00 AM            118 eula.1041.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.1042.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.2052.txt                                                                      
-a----        11/7/2007   8:00 AM          17734 eula.3082.txt                                                                      
               7/7/2016   8:50 AM             93 HaxLogs.txt                                                                        
-a----         7/8/2016   8:30 AM              0 Test.txt 
 Nyagolova08 июл. 2016 г., 16:40
Для меня это работает без проблем, но вы пытались не использовать кавычки для расширения тоже? подобноGet-ChildItem -Path C: -Exclude *.txt ?

Ответы на вопрос(3)

Силы тяжести а такжеБрайана Рейнольдса полезные ответы:

У вашего подхода есть две разные проблемы:

нацеливаниеC: вероятно, не всегда делает то, что вы хотите, потому чтоC: относится кчто бы ни было текущее местоположение (рабочий реж.) на диске C: на данный момент.

Нацелиться наКорневая папка диска C :, вы должны использоватьC:\, что я предполагаю, что вы имели в виду в оставшейся части этого ответа.

С использованием-Exclude (а также-Include) параметр с ни-Recurse ни-Path значение, заканчивающееся на\* часто не дает результатов. Неожиданное? Действительно - см. Ниже для получения дополнительной информации.

Таким образом,Get-Item -Path C:\* -Exclude *.txt - обратите внимание на переключатель изGet-ChildItem вGet-Item и* послеC:\ - необходим, чтобы ваша команда работала для предметов, расположенныхнепосредственно вC:\ только.Исходная информация:

Использование родного провайдера-Filter параметр обычно предпочтительнее-Include, так как:

это намного быстрее чем-Include благодаря самому провайдеру, выполняющему фильтрациюу источникавместо того, чтобы позволить PowerShell применить фильтрпотомпосле того, как все объекты были получены.

вам не нужно переключаться наGet-Item и добавить\* к-Path значение параметра.

Get-ChildItem -Path C:\ -Filter *.txt отлично работает для сопоставления всех*.txt файлы в корневом каталоге C :, например.

Тем не менее, естьПредостережения:

Язык шаблонов шаблонов, поддерживаемый-Filter имеет меньше возможностей, чем в PowerShell, и может неожиданно совпадать с короткими (8.3) именами файлов - увидетьэтот хорошо проработанный ответ для кровавых деталей.

-Filter поддерживает тольконе замужем образец, тогда как-Include поддерживает несколькомассив шаблонов).

К несчастью,-Filter всегдаположительный (включительно) фильтр и, следовательно, не может быть использован для обеспечения функциональности-Exclude.

Реализация-Include / -Exclude сGet-ChildItem не интуитивно и имеет подводные камни:

Примечание: если вы используете толькоодин -Include шаблон (в отличие от-Exclude), проще добавить шаблон непосредственно в-Path аргумент; например.:Get-ChildItem C:\*.txt

ТЛ; др: Чтобы получить предсказуемое поведение с-Include / -ExcludeиспользоватьGet-Item C:\path\to\* (обратите внимание на приложение\* и переключатель изGet-*Child*Item) - если вы также не используете-Recurse.

-Include а также-Exclude не работать так, как можно было бы ожидать:

-Include а также-Exclude изменитьлист (последний) компонент пути-Path аргумент.

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

Если входной путь не заканчивается\* а также-Recurse не указано, последствия следующие:

-Include: Если последний компонент пути входного пути делаетне соответствовать-Include шаблон (ы), путь вводасам исключен (не включен), а путьребенок элементы никогда не просматриваются - ничего не выводится.

-Exclude: Аналогично, если последний компонент входного путиделает соответствовать-Exclude шаблон (ы), путь вводасам исключен, и путьребенок элементы никогда не просматриваются - ничего не выводится.

В частном случае путиC:\ (Get-ChildItem -Path C:\ -Exclude <any-pattern>), где, возможно, последний компонент пути являетсяпустой строки, Кажется, чтолюбой шаблон исключения считается совпадением, и никакой выходной результат не создается.

Как уже говорилось, проблема не появляется, если-Recurse используется, потому что этосил спуск в поддерево входного пути, даже если сам входной путь не включен / исключен.

Если не-Recurse нужен, единственный способ получить ожидаемое поведение это заменить
Get-ChildItem C:\path\to -Include / -Exclude с
Get-Item C:\path\to\* -Include / -Exclude - обратите внимание на использованиеGet-Item вместоGet-ChildItemи это\* был добавлен к-Path аргумент.

Напротив, если вы используетеGet-ChildItem и здеськаталоги среди матчей,Get-ChildItem будет выводитьих содержание вместо.

С-LiteralPath скорее, чем-Path, -Include а также-Exclude являютсятихо игнорируется - они не имеют никакого эффекта вообще.

Примеры: проблемное использование-Include / -Exclude

Примечание. Чтобы все приведенные ниже команды работали так, как можно было бы ожидать, заменитеGet-ChildItem C:\Windows сGet-Item C:\Windows\* - обратите внимание на использование другого командлета,Get-Itemи приложенный\*.

# HAPPENS TO WORK, BUT IS NOT ROBUST:
# Matches all w* items *inside* C:\Windows, but
# ONLY because w* happens to match 'Windows' - the last input
# path component - too.
Get-ChildItem C:\Windows -Include w*

# HAPPENS TO WORK, BUT IS NOT ROBUST:
# Matches all items whose names *don't* start with a-v *inside* C:\Windows, but
# ONLY because [a-v]* happens not to exclude 'Windows' - the last input
# path component - too.
Get-ChildItem C:\Windows -Exclude [a-v]*


# OUTPUTS NOTHING:
# Because t* doesn't match 'Windows', the child items of 
# 'C:\Windows' are not considered.
Get-ChildItem C:\Windows -Include t*

# OUTPUTS NOTHING:
# Because w* matches 'Windows', it is excluded, and
# the child items of 'C:\Windows' are not considered.     
Get-ChildItem C:\Windows -Exclude w*
 gravity11 июл. 2016 г., 22:17
Боже мой, это тщательное объединение всех различных зависаний, которые у него были! Способ действительно углубиться в рассуждения! :) Где-то вы нашли это, или вы исследовали это самостоятельно?
 mklement021 июл. 2016 г., 07:20
@ Gravity: Спасибо; этот ответ основан на моих собственных исследованиях и экспериментах. Дайте мне знать, если что-то не так.
Решение Вопроса
Get-ChildItem -Path "C:\*" -Include "*.txt"

-Include должен работать, даст вам результаты, которые вы ожидали. Обратите внимание, что я также предоставил подстановочный знак в параметре path, чтобы явно определить путь как «любой файл в корне C:», а не как «C:».

Источник:https://technet.microsoft.com/library/hh849800.aspx

Пример 3 по этой ссылке, в случае, если он перестал функционировать (обратите внимание также на подстановочный знак в пути):

C:\> Get-ChildItem –Path "C:\Windows\Logs\*" -Include "*.txt" -Exclude "A*"
 bradrice08 июл. 2016 г., 17:10
Благодарю. По какой-то причине подстановочный знак в пути работает.
 Chris7678677717 дек. 2018 г., 18:38
Это то, что меня бесит: когда API / команды ведут себя по-разному в зависимости от ввода. Конечно, это ДОЛЖНО случиться, но в данном случае я имею в виду именно то, что имею в виду. Когда вы проходите в одиночку пути, это предполагает подстановочный знак*, Когда вы добавляете-Include или же-Exclude это перестает делать такое предположение, и документы не говорят этого. Что еще более важно команда называется CALLEDGet-ChildItem, Это должно быть получение предметов РЕБЕНКА. Подстановочный знак должен быть ненужным во всех случаях.

» без косой черты после - причина, по которой вы не получаете желаемых результатов. Это интерпретируется как относительный путь к текущему каталогу, а не к корню диска C. (Увидеть:Путь без косой черты после буквы диска и двоеточия - на что это указывает?)

Если вместо этого вы используете 'C: \', он должен работать как положено.

Изменить: Моя ошибка; Я отвечал конкретно на примеры, которые используют только «-exclude».

 gravity08 июл. 2016 г., 22:45
На самом деле это не так. Попробуй сам.Get-ChildItem -Path "C:\" -Include "*.txt" не дает результатов, тогда как,Get-ChildItem -Path "C:\*" -Include "*.txt" показывает мне все расширения файлов с.txt
 bradrice08 июл. 2016 г., 23:16
Да, я не получаю результатов, если не добавлю *. после C: \. Я не уверен почему, потому что я нахожусь в местоположении C: и если я использую Get-ChildItem C: или Get-ChildItem C: \, я получаю все файлы обратно. Похоже, только -Include и -Exclude сделать это для меня. Я использую PSVersion - 5.0.10586.122
 mklement011 июл. 2016 г., 16:18
Это (к сожалению) верно, что добавление * в отсутствие -Recurse необходимо с -Include / -Exclude), но этот ответ хорошо говорит оC: противC:\

Ваш ответ на вопрос