Чтобы найти файлы в каталоге, в именах которых есть "foo" и "bar", мы можем использовать:
Get-ChildItem | Where-Object {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}
Есть ли более элегантный способ написать (или запросить) это?
Чтобы найти файлы в каталоге, в именах которых есть "foo" и "bar", мы можем использовать:
Get-ChildItem | Where-Object {$_.Name -like "*foo*" -and $_.Name -like "*bar*"}
Есть ли более элегантный способ написать (или запросить) это?
Почему вы считаете свою команду не элегантной? Если вам нужен более краткий код, это может быть лучше на 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}
Я думаю, что более элегантный код является субъективным и действительно зависит от вашего стиля кодирования. Я лично предпочитаю вашу строку кода, так как она совсем не загадочная и достаточно компактная для того, что она делает.
Еще один способ сделать это - использовать соответствие регулярных выражений:
Get-ChildItem | Where-Object {$_.Name -match "(?=.*foo)(?=.*bar)"
Если вам нужна более короткая версия (версии), вы также можете сократить ее до:
gci |? {$_.Name -match "(?=.*foo)(?=.*bar)"
Насколько я понимаю название вопроса, ответ будет таким:
'*.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
Вот две возможности:
gci | ? Name -like *foo* | ? Name -like *bar*
gci *foo* | ? Name -like *bar*
Я согласен с ST8, хотя, что ваша версия в порядке.