1

Чтобы найти файлы в каталоге, в именах которых есть "foo" и "bar", мы можем использовать:

Get-ChildItem | Where-Object {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}

Есть ли более элегантный способ написать (или запросить) это?

4 ответа4

3

Почему вы считаете свою команду не элегантной? Если вам нужен более краткий код, это может быть лучше на Code Review.

Кстати, я не думаю, что эта команда сработает.

Если вы хотите использовать -like , добавьте символы подстановки:

gci | ? {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}

Если вы не хотите использовать подстановочные знаки, используйте -match:

gci | ? {$_.Name -match "foo" -and $_.Name -match "bar"}

Есть много способов снять кожу с кошки

gci *foo* | ? {$_.Name -in (gci *bar*).Name}

Я думаю, что более элегантный код является субъективным и действительно зависит от вашего стиля кодирования. Я лично предпочитаю вашу строку кода, так как она совсем не загадочная и достаточно компактная для того, что она делает.

1

Еще один способ сделать это - использовать соответствие регулярных выражений:

Get-ChildItem | Where-Object {$_.Name -match "(?=.*foo)(?=.*bar)"

Если вам нужна более короткая версия (версии), вы также можете сократить ее до:

gci |? {$_.Name -match "(?=.*foo)(?=.*bar)"

0

Насколько я понимаю название вопроса, ответ будет таким:

'*.txt','*.log' | ForEach-Object { Get-ChildItem $_ }   # 'pure' Powershell
where.exe /r . *.txt *.log                              # external command

Но для получения файлов с именами 'foo' и 'bar' (которые я считаю одним шаблоном) могут быть некоторые очевидные решения:

Get-ChildItem *foo*bar*                           # if the order is given
Get-ChildItem  `
  | Where-Object Name -match 'foo.*bar|bar.*foo'  # if not
0

Вот две возможности:

gci | ? Name -like *foo* | ? Name -like *bar*

gci *foo* | ? Name -like *bar*

Я согласен с ST8, хотя, что ваша версия в порядке.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .