【问题标题】:Interpreting an extension with a wildcard IN an array在数组中解释带有通配符的扩展
【发布时间】: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 运算符持怀疑态度。

【问题讨论】:

  • -incomparison operator 只会在存在完全匹配的情况下返回 true。如果您担心通配符,-match 可能是更好的选择。它允许regex
  • 在您的第一个代码中,-match 应该是 -like。对于第二个代码,您可以通过将$PicExtentions 设置为您想要捕获的实际扩展名来使其工作:$PicExtensions = '.jpg','.jpeg','.png'。作为旁注,您在这里不需要@()
  • 旁注:.jp* 是通配符模式,但-match 运算符用于正则表达式,而不是通配符(即-like)。您的子句 $_.Extension -match '.jp*' 只是偶然起作用,因为 .jp* 恰好 是一个有效的正则表达式(并非所有通配符表达式都如此)并且正则表达式不会自动锚定在开头/结尾字符串(与通配符表达式不同)。碰巧,正则表达式匹配的内容包括 $_.Extension -like '.jp*' 将匹配的所有内容(但实际上匹配的不止这些)。

标签: arrays powershell wildcard


【解决方案1】:

我强烈建议使用正则表达式而不是字符串列表。

$PicExtensions = 'jp.*|png'
$VideoExtensions = 'mp4|mov|mpg|mts|3g2|3gp|avi|mkv|flv|wmv'

$Files = Get-ChildItem -LiteralPath $PSScriptRoot -Recurse | Where-Object {
    $_.Extension -match "^\.(${PicExtensions})$" -or
    $_.Extension -match "^\.(${VideoExtensions})$"
}

如果您想继续使用字符串列表(不推荐),您必须单独比较每个元素(这势必会表现得很差),因为 -contains-in 运算符只允许完全匹配,而你想做通配符匹配。

$Files = Get-ChildItem -LiteralPath $PSScriptRoot -Recurse | Where-Object {
    $ext = $_.Extension
    ($PicExtensions | Where-Object {$_ -like $ext}) -or
    ($VideoExtensions | Where-Object {$_ -like $ext})
}

【讨论】:

    【解决方案2】:

    您可以在路径中指定多个模式,如果它不必是字面的。

    $pic = echo *.jp* *.png
    $vid = echo *.mp4 *.mov *.mpg *.mts *.3g2 *.3gp *.avi *.mkv *.flv *.wmv
    
    get-childitem -path ($pic + $vid) -recurse
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多