Новый параметр -file get-childItem быстрый как -filter или медленный как -include?
РЕДАКТИРОВАТЬ Надеюсь здесь, чтобы уточнить мой запутанный и вводящий в заблуждение вопрос... основываясь на моем ошибочном предположении, что -file принимает входные данные. Спасибо, что объяснил мне и указал, что это просто параметр переключателя; входные данные в моем примере фактически передаются в -path. Похоже, что это может быть самый быстрый способ PowerShell для поиска файлов нескольких типов, так как -filter принимает только один вход, а -include медленнее.
Документация get-childItem гласит: "Фильтры более эффективны, чем другие параметры, поскольку поставщик применяет их при извлечении объектов, а не заставляет Windows PowerShell фильтровать объекты после их извлечения".
v3 имеет новый набор параметров с параметром -file, который, вероятно, предназначен для исключения каталогов, чтобы соответствовать cmd.exe dir /a:-d
Как -include и в отличие от -filter, -file принимает несколько, как в gci -file "*.ldf","*.bak"
Так что мне интересно, и до сих пор не удалось надежно проверить, является ли -file похожим на -filter с точки зрения производительности, то есть "более эффективным" или больше похожим на "другие параметры", такие как -include. Если -file является фильтром, это хорошо, потому что afaict -filter обрабатывает только один фильтр за раз, поэтому, если вам нужно несколько фильтров (например, *.ldf и *.bak), вам нужно либо запустить gci -filter
дважды или используйте -include вместо. Поэтому мне интересно, если -file позволяет нам воспользоваться преимуществами эффективности фильтра для нескольких фильтров.
Я наткнулся на какой-то текст ошибки, который вселил в меня оптимизм. Параметр -file хочет, чтобы -path был текущим каталогом, поэтому gci -path $path -file "*.bak","*.ldf"
выдает ошибку. Push-location кажется приемлемым решением, но здесь меня больше интересует содержание текста ошибки:
Get-ChildItem: Невозможно преобразовать "System.Object[]" в тип "System.String", требуемый параметром "Filter". Указанный метод не поддерживается.
Я вызвал -file, но ошибка сообщает о "параметре" Фильтр "". Так что, может быть, -file эффективен как фильтр? OTOH, -filter не нужен -path, чтобы быть текущим каталогом, поэтому в этом отношении -file больше похож на -include.
1 ответ
Только одна точность:
gci -path $path -file "*.bak","*.ldf"
-file
это switch parameter
(как -directory
is) и не принимает значения (чтобы получить только файлы, используйте параметр File и пропустите параметр Directory. Чтобы исключить файлы, используйте параметр Directory и пропустите параметр File); тогда "*.bak","*.ldf"
неявно передаются -filter
как ценность, и filter
принимать только string
и не string[]
, Вот откуда появилась ваша ошибка.
Что касается производительности: использование -file
или же -directory
быстрее, чем с помощью where-object psiscontainer
или же ? { !$_.psiscontainer}
потому что это делается на уровне провайдера (в данном случае файловой системы).