Powershell删除行-notmatch IF语句

时间:2014-04-08 20:53:01

标签: windows powershell line powershell-v3.0

我有以下代码:

$reader = [System.IO.File]::OpenText(".\Babytest.txt")
try {
    for(;;) 
    {
    $line = $reader.ReadLine()
    if($line eq $null) {break}
            if($line -notMatch 'BB1') { $line }


    }
}
finally {
    $reader.Close()
}

我理解这段代码的方式是:

$reader = [System.IO.File]::OpenText(".\Babytest.txt")

- 打开test.txt文件

for(;;) 
        {
        $line = $reader.ReadLine()
        if($line eq $null) {break}
                 if($line -notMatch 'BB1') { $line }

- 如果该行为空= EOF中断代码否则进入另一个IF查找其中没有'BB1'的所有行,输出$ line

我想做什么

首先,这段代码有效,虽然IF - notmatch似乎不起作用,但我仍然在输出到shell的内容中看到了带有BB1的行。我错过了什么?

如何将其写入文件?这是一种比管道更反对的东西,所以我不确定是否像

这样的东西
|out-file "\\fhnsrv01\home\aborgetti\Documentation\Scripts\Baby Removal Project\babyoutput.txt"

会工作...非常感谢所有的帮助...我整天都在研究这个问题,但看起来PowerShell有一个学习曲线,我已经掌握了它,你可以做的很多...

更新

示例字符串:

AR|111000111011|500001|1|DavT|2013-09-10 12:03:18|2014-04-07 10:23:09|A25415|3|2013-08-11|2013-08-13|Y|01 |APPROVED|01 |APPROVED|35 |

没有BB1的字符串

AR|111100001BB1|500002|1||2014-04-02 15:30:12|2014-04-04 10:55:54|A32009|3|2014-03-31|2014-04-02|Y|01 |APPROVED|03 |PENDING|34 |

BB1字符串

我想删除像BB1 line

这样的行

3 个答案:

答案 0 :(得分:1)

使用for循环和StreamReader来读取文本文件,虽然不是错误的,但这不是在Powershell中执行操作的正确方法。除非你有某种关键性能要求(在这种情况下你不应该编写脚本),否则使用Powershell为你提供的高级工具要好得多。

Get-Content .\Babytest.txt |?{ $_ -notmatch 'BB1' } | Out-File 'BabyOutput.txt'

这应该做你想要的。

答案 1 :(得分:0)

我会这样做,但我知道什么:

while (($line = $reader.ReadLine()) -ne $null) {
    if($line -notlike "*BB1*")
    {
        $line
    }
}

答案 2 :(得分:0)

试试这个。它使用原生powershell命令,实际上会在大文件上超出您的流阅读器:

Get-Content .\Babytest.txt -ReadCount 1000 |
 foreach {
  $_ -notmatch 'BB1' |
  Add-Content '\\fhnsrv01\home\aborgetti\Documentation\Scripts\Baby Removal Project\babyoutput.txt'
}

编辑:使用发布的测试数据 -

'AR|111000111011|500001|1|DavT|2013-09-10 12:03:18|2014-04-07 10:23:09|A25415|3|2013-08-11|2013-08-13|Y|01 |APPROVED|01 |APPROVED|35 |',
'AR|111100001BB1|500002|1||2014-04-02 15:30:12|2014-04-04 10:55:54|A32009|3|2014-03-31|2014-04-02|Y|01 |APPROVED|03 |PENDING|34 |'|
set-content ./babytest.txt

Get-Content .\Babytest.txt -ReadCount 1000 |
 foreach {
  $_ -notmatch 'BB1'
}

AR|111000111011|500001|1|DavT|2013-09-10 12:03:18|2014-04-07 10:23:09|A25415|3|2013-08-11|2013-08-13|Y|01 |APPROVED|01 |APPROVED|35 |