Новый параметр -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} потому что это делается на уровне провайдера (в данном случае файловой системы).

Другие вопросы по тегам