【问题标题】:Powershell remove line where -notmatch IF StatementPowershell 删除行 where -notmatch IF 语句
【发布时间】:2014-05-21 19:01:01
【问题描述】:

我有以下代码:

$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 }

-- 如果该行为 null=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 线这样的线

【问题讨论】:

  • 您需要使用-eq 而不是eq,如果您愿意的话,您可以使用while(1){} 而不是for(;;) .. 另外,对或删除婴儿
  • @Cole9350 哈哈,你是个傻瓜,谢谢broseidon。我可能无法将其输出到输出文件,我是否需要在第二个 IF 中处理输出?还是之后?
  • 我仍然无法匹配其中包含 BB1 的行!
  • 要么您没有向我们提供准确的信息,要么您的系统出现了非常奇怪的问题。根据以下所有答案,-notmatch 'BB1' 应该可以正常工作。文件的编码奇怪吗?
  • 好吧,我只有5行,其中3行在字符串中有BB1,应该返回2,但所有5都返回

标签: windows powershell line powershell-3.0


【解决方案1】:

试试这个。它使用本机 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 |

【讨论】:

  • 奇怪,我知道我可能做错了什么......看看字符串,我需要更改我的表达式以匹配吗?这就像其他人一样工作,但没有一个匹配 BB1 字符串并将它们删除...谢谢您的时间,请继续尝试!
  • 第二个示例中没有出现字符串“BB1”。我们需要更好地解释您要过滤的内容。
  • 我试过了,整个 numberstring 和 bb1 不匹配,但它总是输出 BB1 字符串
  • 您确定没有在输出文件中看到旧数据吗?我使用您的测试数据更新了答案,它似乎有效。您是否在测试之间清除该输出文件?
【解决方案2】:

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

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

这应该做你想做的。

【讨论】:

  • 我把它放在一个ps1文件中运行了,它没有取出BB1所在的行,也没有输出到文件中……我做错了吗?
  • 在 PowerShell 中使用 .NET 框架类型是完全可以接受的。有时它是绝对必要的。在这种情况下,Get-Content 更加“PowerShell 友好”,但我强烈鼓励人们使用 .NET 框架来发挥自己的优势。
  • 您无需将其放入脚本中,只需将其粘贴到控制台即可。 Get-Content .\Babytest.txt 是否输出了你所期望的所有内容?如果是这样,您的正则表达式模式可能没有达到您的预期。
  • 是的,它确实会打印出文件中的所有内容,我用示例字符串进行了更新,请看一下。我不是最终会运行脚本的人,这就是为什么将它放在一个文件中会很有用..
  • @Trevor - 同意在对您有利的情况下使用 .Net,但这不是其中之一。带有 -ReadCount 的 Get-Content 将在此应用程序中胜过 .Net 流式阅读器。
【解决方案3】:

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

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

【讨论】:

  • BB1也不拿出来给你举个例子
猜你喜欢
  • 1970-01-01
  • 2019-02-20
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多