#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, оно просто игнорирует оператор исключения и включает файлы в этот каталог.