Powershell - 与数组匹配

Powershell - match with array

我是 Powershell 的初学者,我可以使用一些脚本。但现在我遇到了这个小问题。 我有这个小脚本。我有一个包含一些文件 $ORIGEN 的文件夹。我需要获取所有与变量 $ARCHIVOS 中的 te 值匹配的名称文件,并将它们放入新变量 $DATA 中。 谁能告诉我如何将 $ARCHIVOS 中的名称与文件夹中的文件进行匹配?如果我在变量 $ARCHIVOS 中只使用 1 个值,它工作正常,但是当我有一个数组时,y 不匹配任何东西。我尝试了很多解决方案,但没有。 提前感谢您的帮助。对不起我的英语

$ORIGEN= "C:\FILES\"
$ARCHIVOS='MLR*.384', 'MP0*.384'

 $data= Get-ChildItem $ORIGEN | Where-Object{$_.Name -match $ARCHIVOS}
 Write-Host $data

结合 Get-ChildItem (or, since you're not recursing, just Get-Item) 与 *-Include,它(与 -Filter 不同)接受通配符模式的 数组 :[1]

Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS
  • -File 指示 Get-ChildItem 到 return 仅匹配 文件 (而不是目录)。

  • 输入路径 ($ORIGEN) 后附加的 /* (\*) 通配符是必需的,因为 _Include-Exclude,在没有 -Recurse 的情况下,仅应用于 输入路径本身 ,而不是它们的 子项 项。


如果您只想匹配文件名称,只需访问 .Name 属性 Get-ChildItem 通过 (...) 调用的输出,grouping operator, which, thanks to member-access enumeration,returns 匹配文件的名称作为数组(假设至少有两个):

$fileNames = (Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS).Name

至于你试过的, $_.Name -match $ARCHIVOS:

  • -match operator operates on regular expressions (regexes), not on wildcard expressions,但您的 $ARCHIVOS 数组包含 通配符 表达式。

  • 此外,-match 不(有意义地)接受 RHS 上的 array 正则表达式。

  • 如果你确实想用 -match 解决这个问题(这不是必需的,因为顶部显示了更短和更有效的解决方案),你必须创建使用 交替 (|):

    单个 正则表达式
    # Note how the individual patterns are now expressed as *regexes*
    # and are *anchored* with ^ and $ to ensure that the *entire name* matches.
    # By default, -match finds *substrings*.
    $_.Name -match ('^MLR.*\.384$', '^MP0.*\.384$' -join '|')
    

[1] 此外,-Filter - 对于 单一 模式通常优于 -Include ]performance 原因 - 不使用 PowerShell 的通配符语言,而是将匹配委托给主机平台的文件系统 API。这意味着 [0-9][fg] 等范围或字符集表达式 受支持,并且在 Windows 上,几个 legacy quirks 影响匹配行为 - 请参阅 了解更多信息。