【问题标题】:Using two Where commands to run two checks使用两个 Where 命令运行两个检查
【发布时间】:2016-11-12 20:27:23
【问题描述】:

我正在使用这个命令

Where {$_.Extension -match "zip||rar"}

但也需要使用这个命令

Where {$_.FullName -notlike $IgnoreDirectories}

我应该使用 && 还是 II

Where {$_.Extension -match "zip||rar"} && Where {$_.FullName -notlike $IgnoreDirectories}

Where {$_.Extension -match "zip||rar"} || Where {$_.FullName -notlike $IgnoreDirectories}

?

我想要完成的是提取每个 zip 和 rar 文件,但我想跳过我的某些目录中的 zip 或 rar 文件的提取。最好的解决方案是什么?

【问题讨论】:

    标签: where powershell-4.0


    【解决方案1】:

    如有疑问,请阅读documentation

    Windows PowerShell 支持以下逻辑运算符。

    • -and 逻辑与。仅当两个语句都为 TRUE 时才为 TRUE。
    • -or 逻辑或。当其中一个或两个陈述为 TRUE 时为 TRUE。
    • -xor 逻辑异或。仅当其中一个语句为 TRUE 而另一个语句为 FALSE 时才为 TRUE。
    • -not 逻辑不。否定它后面的语句。
    • ! 逻辑不。否定它后面的语句。 (同-not

    将两个子句放在同一个脚本块中,并用适当的逻辑运算符连接它们。对于两个子句之间的逻辑与,请使用-and

    Where-Object {
      $_.Extension -match "zip||rar" -and
      $_.FullName -notlike $IgnoreDirectories
    }
    

    对于两个子句之间的逻辑或,请使用-or

    Where-Object {
      $_.Extension -match "zip||rar" -or
      $_.FullName -notlike $IgnoreDirectories
    }
    

    你的情况可能是前者。


    请注意,由于两个 | 之间存在空字符串,因此您的正则表达式 zip||rar 匹配任何扩展名。要仅匹配扩展名为 .rar.zip 的项目,请删除一个管道:$_.Extension -match "zip|rar"

    【讨论】:

    • 您的建议不起作用,因为我没有收到错误消息“您必须在表达式或语句中的意外标记 '$.FullName' 之后提供值表达式。”我该如何解决这个错误?我想这就是为什么我需要两个独立的 where's。
    • 这似乎解决了表达式问题,但它会起作用吗?其中 {($_.Extension -match "zip||prd") -and ($.FullName -notlike $ignore)}
    • 应该是$_,而不仅仅是$。不知道下划线是如何丢失的。固定。
    • 括号不是必需的,因为-match-notlike 运算符的precedence 高于逻辑运算符。此外,您仍然在正则表达式中有双管道,因此该表达式仍将匹配任何扩展名。除此之外,条件是否有效取决于$ignore 的值以及您希望它排除的内容。
    • 谢谢,在我当前的过程完成后,我会尝试你的建议并删除括号。
    猜你喜欢
    • 2013-08-24
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2021-02-16
    • 1970-01-01
    • 2023-04-03
    • 2013-04-23
    相关资源
    最近更新 更多