【问题标题】:Powershell - match with arrayPowershell - 与数组匹配
【发布时间】:2021-05-03 13:57:35
【问题描述】:

我是 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

【问题讨论】:

    标签: arrays powershell string-matching


    【解决方案1】:

    Get-ChildItem(或者,因为您没有递归,只需Get-Item)与*-Include 结合起来,后者(与-Filter 不同)接受通配符的数组模式:[1]

    Get-ChildItem -File $ORIGEN/* -Include $ARCHIVOS
    
    • -File 指示Get-ChildItem 只返回匹配的文件(而不是目录)。

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


    如果您只需要匹配文件的名称,只需通过(...) 访问Get-ChildItem 调用的输出中的.Name 属性,即grouping operator,感谢 member-access enumeration,将匹配文件的名称作为数组返回(假设至少有两个):

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

    至于你尝试了什么$_.Name -match $ARCHIVOS

    • -match 运算符在 regular expressions (regexes) 上运行,而不是在 wildcard expressions 上运行,但您的 $ARCHIVOS 数组包含 通配符 表达式。

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

    • 如果您确实想使用 -match 解决此问题(这不是必需的,因为顶部显示的解决方案更短更有效),您必须创建一个 single使用 alternation 的正则表达式 (|):

      # 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 通常比 -Include 更可取 - 不使用 PowerShell 的通配符语言,但将匹配委托给主机平台的文件系统 API。这意味着[0-9][fg] 等范围或字符集表达式 受支持,并且在Windows 上,一些遗留问题会影响匹配行为 - 请参阅this answer 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 2017-07-02
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 2016-03-26
      • 2021-07-30
      相关资源
      最近更新 更多