在Powershell中使用Where-Object的多个条件

时间:2017-03-15 16:29:01

标签: powershell

从以下文本文件中删除包含 pizza 一词的行:

The cat is my favorite animal.
I prefer pizza to vegetables.
My favorite color is blue.
Tennis is the only sport I like.
My favorite leisure time activity is reading books.

我运行了以下代码并成功删除了第二行。

http_build_query

但是,我还没有找到一种方法来删除包含单词 pizza 或单词 sport 的所有行。我已尝试使用此代码执行此操作:

$inputFile =  "C:\Temp\Text.txt"
Get-Content $inputFile | Where-Object {$_ -notmatch 'pizza'} | Set-Content "C:\Temp\Filtered.txt"

但它不起作用,因为输出文件与原始文件相同。

2 个答案:

答案 0 :(得分:3)

我发现Where-Object {$_ -notmatch 'this|that'}是一种更好的匹配多个条件的方法,因为管道就像-Or一样。

$inputFile =  "C:\Temp\Text.txt"
Get-Content $inputFile | Where-Object {$_ -notmatch 'pizza|sport'} | Set-Content "C:\Temp\Filtered.txt"

答案 1 :(得分:0)

您需要明确逻辑

首先,使用积极条件 获取我的文本文件中包含这个词的所有行' pizza' 这个词' sport':

Get-Content $inputFile | Where-Object {$_ -match 'pizza' -or $_ -match 'sport'}

输出应为

I prefer pizza to vegetables.
Tennis is the only sport I like.

然后,否定条件以获得所需结果:

Get-Content $inputFile | Where-Object { -NOT ($_ -match 'pizza' -or $_ -match 'sport') }

De Morgan's laws允许将否定条件重写为

Get-Content $inputFile | Where-Object { $_ -NOTmatch 'pizza' -AND $_ -NOTmatch 'sport' }

以下脚本在PowerShell中实现了 De Morgan的法律truth table(天真)实现

''
'{0,-6} {1,-6}: {2,-7}  {3,-7}  {4,-7}  {5,-7}' -f 'P', 'Q', 'DM1a', 'DM1b', 'DM2a', 'DM2b'
''
ForEach ( $P in $True, $False ) { 
    ForEach ( $Q in $True, $False ) { 
        '{0,-6} {1,-6}: {2,-7}  {3,-7}  {4,-7}  {5,-7}' -f $P, $Q, 
            ( -not ( $P -and $Q ) -eq (      ( ( -not $P ) -or  ( -not $Q ) ) ) ),
            (      ( $P -and $Q ) -eq ( -not ( ( -not $P ) -or  ( -not $Q ) ) ) ),
            ( -not ( $P -or  $Q ) -eq (      ( ( -not $P ) -and ( -not $Q ) ) ) ),
            (      ( $P -or  $Q ) -eq ( -not ( ( -not $P ) -and ( -not $Q ) ) ) )
    }

}

输出(请注意DM2a列涵盖您的案例):

PS D:\PShell> D:\PShell\tests\DeMorgan.ps1

P      Q     : DM1a     DM1b     DM2a     DM2b   

True   True  : True     True     True     True   
True   False : True     True     True     True   
False  True  : True     True     True     True   
False  False : True     True     True     True