【问题标题】:Where-Object optimization PowershellWhere-Object 优化 Powershell
【发布时间】:2018-12-06 00:08:39
【问题描述】:

我有这个可以正常工作的命令:

$FichierXML = get-childitem "$PsScriptRoot" | Where-Object { ($_.Name -notlike "creer*") -and ($_.Name -notlike "des*") -and ($_.Name -notlike "ins*")  -and ($_.Name -like "*.XML") }

它会找到名称中不包含“creer”、“des”和“ins”三个单词的 .XML 文件。

我的问题是,是否有一种最佳方式来执行此操作,而不是像我正在做的那样在 where-object 中使用多个条件?也许是一条短途?像这样当然没问题,但我总是很想学习更好的方法。

【问题讨论】:

    标签: powershell filtering


    【解决方案1】:

    可能是这样的:

    $FichierXML = Get-ChildItem "$PsScriptRoot" -Filter '*.XML' | Where-Object { $_.Name -notmatch '^(creer|des|ins)' }
    

    使用-Filter 参数仅获取.XML 文件并使用正则表达式-notmatch 作为文件名。

    【讨论】:

      【解决方案2】:

      -in-notin 运算符,但它们会检查多个值是否完全匹配。没有像 -notlikein 或类似的东西。

      不是 100%,但相信这应该可行:

      $FichierXML = Get-ChildItem "$PSScriptRoot" |
                      Where-Object {$_.Name -notmatch "^(creer|des|ins)" -and $_.Name -like "*.XML"}
      

      说明:

      • -[not]match 使用正则表达式,-[not]like 不使用
      • | 充当逻辑“或”
      • ^ 指定字符串的开头
      • () 被展开,所以你有 ^creer, ^des,^ins

      相关: Operators documentation

      编辑:合并来自Matt's comment的更正

      【讨论】:

      • 您的正则表达式可能无法按您预期的方式工作。例如,它将匹配 Ingress 和 Insssssstant。另外,我会从备用匹配组中获得线锚的起点
      • 谢谢 - * 是一个错字,看起来 Theo 发布了一个 answer,其中锚点不在“或”中。为了我自己的利益,为什么要匹配 Ingress?
      • 因为s* 会匹配0 次或更多 次。有效地说出以“in”开头的任何内容
      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-15
      • 1970-01-01
      • 2023-03-31
      • 2016-01-13
      • 2021-05-21
      相关资源
      最近更新 更多