【发布时间】:2019-07-26 16:34:34
【问题描述】:
为什么会这样:
$VideoExtensions = @('.mp4','.mov','.mpg','.mts','.3g2','.3gp','.avi','.mkv','.flv','.wmv')
$Files = Get-ChildItem -LiteralPath $PSScriptRoot -Recurse | Where-Object {
$_.Extension -match '.jp*' -or
$_.Extension -in $VideoExtensions
}
但不是这个:
$PicExtensions = @('.jp*','.png')
$VideoExtensions = @('.mp4','.mov','.mpg','.mts','.3g2','.3gp','.avi','.mkv','.flv','.wmv')
$Files = Get-ChildItem -LiteralPath $PSScriptRoot -Recurse | Where-Object {
$_.Extension -in $PicExtensions -or
$_.Extension -in $VideoExtensions
}
.jp* 通配符被完全忽略。如果我使用 -like 它会捕获不完全是 .png 的文件吗?我对使用 -like 运算符持怀疑态度。
【问题讨论】:
-
-in的 comparison operator 只会在存在完全匹配的情况下返回true。如果您担心通配符,-match可能是更好的选择。它允许regex -
在您的第一个代码中,
-match应该是-like。对于第二个代码,您可以通过将$PicExtentions设置为您想要捕获的实际扩展名来使其工作:$PicExtensions = '.jpg','.jpeg','.png'。作为旁注,您在这里不需要@()。 -
旁注:
.jp*是通配符模式,但-match运算符用于正则表达式,而不是通配符(即-like)。您的子句$_.Extension -match '.jp*'只是偶然起作用,因为.jp*恰好 也 是一个有效的正则表达式(并非所有通配符表达式都如此)并且正则表达式不会自动锚定在开头/结尾字符串(与通配符表达式不同)。碰巧,正则表达式匹配的内容包括$_.Extension -like '.jp*'将匹配的所有内容(但实际上匹配的不止这些)。
标签: arrays powershell wildcard