要在目录中查找文件名中同时包含“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 的观点,认为你的版本很好。