Вот метод, который я наконец-то придумал после борьбы:
Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*
Чтобы сделать вывод более чистым (только путь), используйте:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname
Чтобы получить толькопервый результат, используйте:
(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1
Теперь для важных вещей:
Чтобы искать только файлы / каталоги, не используйте -File
или -Directory
(смотри ниже почему).Вместо этого используйте это для файлов:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
и удалите -eq $false
для каталогов. не оставляйте в конце подстановочный знак, например bin/*
.
Почему бы не использовать встроенные переключатели?Они ужасны и удаляют функции случайным образом.Например, чтобы использовать -Include
с файлом, необходимо завершить путь подстановочным знаком.Однако это отключает переключатель -Recurse
, не сообщая вам:
Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib
Можно подумать, что это даст вам все *.lib
s во всех подкаталогах, но он будет искать только верхний уровень bin
.
Для поиска каталогов вы можете использовать -Directory
, но затем вы должны удалить конечный подстановочный знак.По какой-то причине это не деактивирует -Recurse
.Именно по этим причинам я рекомендую не использовать встроенные флаги.
Вы можете значительно сократить эту команду:
Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}
становится
gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
Get-ChildItem
имеет псевдоним gci
-Path
по умолчанию для позиции 0, поэтому вы можете просто указать путь первого аргумента -Recurse
связан с -s
-Include
не имеет сокращения - Используйте одинарные кавычки для пробелов в именах / путях, чтобы вы могли заключить всю команду в двойные кавычки и использовать ее в командной строке.Если сделать это наоборот (заключить в одинарные кавычки), вы получите ошибки