【问题标题】:Powershell - LIKE against an arrayPowershell - 像数组一样
【发布时间】:2012-10-22 20:22:00
【问题描述】:

对于每个正在处理的文件,都会检查其名称是否满足条件。例如,给定以下过滤器列表:

$excludeFiles = @"
aaa.bbb
ccccc.*
ddddd???.exe
"@ | SplitAndTrim;

如果文件与任何行匹配,它应该从处理中排除文件。尽量避免match/regex,因为这个脚本需要被不知道的人修改,并且有几个地方需要实现。

$excludedFiles 和类似的被故意定义为here-string。它允许最终用户/操作员直接从 CMD/Powershell 窗口粘贴一堆文件名。

Powershell 似乎不接受针对数组的-like,所以我不能这样写:

"ddddd000.exe" -like @("aaa.bbb", "ccccc.*", "ddddd???.exe")

我错过了一个选项吗?如果 Powershell 本身不支持它,那么最简单的实现方法是什么?

【问题讨论】:

  • 查看乔什·爱因斯坦的回答:stackoverflow.com/questions/848859/…
  • 谢谢,@dugas,但我不明白为什么会出现这些并发症 - 与下面的两行相比 - 请参阅我接受的答案。

标签: arrays powershell sql-like


【解决方案1】:

这是已接受答案中模式的简短版本:

($your_array | %{"your_string" -like $_}) -contains $true

应用于OP中获取的案例

PS C:\> ("aaa.bbb", "ccccc.*", "ddddd???.exe" | %{"ddddd000.exe" -like $_}) -contains $true
True

【讨论】:

    【解决方案2】:

    您可以针对名称集合执行模式匹配,但不能针对模式列表。试试这个:

    foreach($pattern in $excludeFiles)
    {
        if($fileName -like $pattern) {break}
    }
    

    以下是如何将其包装到函数中:

    function like($str,$patterns){
        foreach($pattern in $patterns) { if($str -like $pattern) { return $true; } }
        return $false;
    }
    

    【讨论】:

    • 我一开始就是这么想的……只是不喜欢每次我需要这个功能时都必须实现这个循环的想法。如果没有其他人提供替代方案,我会接受这个答案。
    • 将其包装在一个函数中并重用它:)
    • 这正是我所做的 - 我还更新了您的答案以包含我的解决方案。
    【解决方案3】:

    我想你可以使用Get-ChildItem -Exclude 参数:

    Get-ChildItem $theFileToCheck -exclude $excludeFiles
    

    如果您有要检查的文件数组,Get-ChildItem 接受路径数组:

    Get-ChildItem $filesToCheck -exclude $excludeFiles
    

    【讨论】:

    • 谢谢 - 我可以确认 Get-ChildItem 或只是 dir (我更习惯于 Windows 术语)通过与 LIKE 相同的模式正确排除,它适用于字符串数组,它可以非常方便地用于多种用途。不幸的是,它不能满足我的需要,因为在某些情况下我需要直接使用字符串,而不是文件对象。不过,您的回答值得 +1。
    【解决方案4】:

    $excludeFiles.Where{$stringToTest -like $_}

    Powershell 数组有一个 Where 方法可以接受表达式输入,因此使用 {} 而不是 ()。输入一个字符串进行测试,它将使用标准管道遍历数组,因此 $_ 表示数组的元素。

    输出匹配元素的列表。

    PS H:\> $excludeFiles = @("aaa.bbb", "ccccc.*", "ddddd???.exe")
    PS H:\> $stringToTest = "ddddd000.exe"
    PS H:\> $excludeFiles.Where{$stringToTest -like $_}
    ddddd???.exe
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2017-11-07
      • 2021-10-30
      相关资源
      最近更新 更多