PowerShell get-дочерний элемент отказывается исключить каталог

#powershell

#powershell

Вопрос:

Я пытаюсь просто искать файлы в общей сетевой папке, но исключаю бесполезный каталог. Я знаю, что есть -exclude вариант для get-childitem .

Однако, когда я пытаюсь запустить команду get-childitem -recurse -exclude \sharefolderexcludeddir , PowerShell игнорирует параметр -exclude . Были предприняты любые и все перестановки пути исключения.

Почему powershell игнорирует параметр -exclude ? Есть ли какой-либо способ просто исключить каталог без необходимости писать несколько строк кода? И нет, метод | ? { $_.FullName -inotmatch 'excludeddir' } передачи по каналу к непригоден для использования, поскольку он полностью игнорируется powershell, если он используется в сетевом ресурсе.

Комментарии:

1. -Exclude применяется к листу целевого элемента. Это -Exclude 'Desktop' исключило c:usersuserdesktop бы каталог, но не файлы под ним. Недостаточно умен, чтобы знать: «Я исключил каталог, поэтому прекратите поиск внизу» .

2. Можете ли вы объяснить, почему передача данных в where недоступна? Я не знаю, что это нарушает функции рекурсивного поиска и поиска текста .

3. Я просто не понимаю, почему get-childitem -recurse |? {($_.Fullname -notmatch '\Desktop\') -and !($_.PSISContainer -and $_.Name -match 'Desktop$')} не делает то, что вы намереваетесь. Если вас интересует только папка рабочего стола в профиле пользователя, тогда get-childitem -recurse -exclude | ? { $_.FullName -notmatch 'c:\users\[^\] \Desktop' } работает.

4. @AdminOfThings , он делает то, что я намереваюсь, но из-за бесконечной мудрости и умелого дизайна MicroShafts он select-string позже прерывается в других каналах. Как я ясно сказал, переход к ? { $_.FullName -notmatch не является жизнеспособным решением моей проблемы.

5. Было бы лучше просто опубликовать свою конечную цель, а не пытаться создать проблему XY. Если ваш пост не предназначен только для того, чтобы просто пожаловаться -Exclude , что здесь никто не собирается исправлять, то ничто из того, что вы предоставили, на самом деле не помогает в решении.

Ответ №1:

Вы можете сделать следующее, если хотите исключить все файлы в вызываемой папке Desktop .

 Get-ChildItem -Recurse -File | Where {
    $_.Directory.Name -ne 'Desktop'
    } | Select-String -Pattern 'mystring'
  

Объяснение:

Проблема в -Exclude том, что она применяется только к конечному элементу пути текущего элемента. Интерактивная документация не объясняет, как -Exclude это работает, и ее особенности. Поэтому, если вы исключите Desktop , любой файл с именем Desktop или любой путь к папке, который заканчивается именем папки Desktop , будут исключены. Однако при использовании он не исключает никаких вложенных папок или вложенных файлов исключенного каталога -Recurse . Я не знаю, является ли это преднамеренным или недосмотром.

Если выполняется только поиск файлов, -File параметр возвращает только файлы. Поскольку FileInfo объекты имеют Directory свойство, которое является DirectoryInfo объектом, вы можете ссылаться на его Name свойство, чтобы определить имя родительского каталога возвращаемого файла.

Комментарии:

1. Я изменил вопрос, поскольку, хотя это работает с обычными папками, это не работает в общих сетевых ресурсах с путями UNC, оно просто игнорирует оператор исключения и включает файлы в этот каталог.