Powershell - 与两个(或更多)模式匹配的文件名

Powershell - 与两个(或更多)模式匹配的文件名

要在目录中查找文件名中同时包含“foo”和“bar”的文件,我们可以使用:

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

有没有更优雅的方式来编写(或查询)这个?

答案1

为什么您认为您的命令不够优雅?如果您只是想要更简洁的代码,那么在代码审查中这样做可能会更好。

顺便说一句,我认为该命令不起作用。

如果要使用-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}

我认为更优雅的代码是主观的,实际上取决于你的编码风格。我个人更喜欢你的代码行,因为它一点也不神秘,而且它的功能相当紧凑。

答案2

我如何理解这个问题的标题,答案将是这样的:

'*.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

答案3

另一种方法是使用正则表达式匹配:

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

如果您想要更短的版本,您也可以将其缩写为:

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

答案4

有两种可能性:

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

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

不过我同意 ST8 的观点,认为你的版本很好。

相关内容