迭代&在子项中搜索字符串

时间:2015-07-27 12:28:45

标签: powershell

我正在尝试构建一个PowerShell脚本,它遍历文件和搜索列表并删除匹配,没有太多运气,这是我的脚本

$path = "D:\Test\"
$filter =  "*.txt"
$files = Get-ChildItem -path $path -filter $filter

foreach ($item in $files)
{
    $search = Get-content -path $path$item
    $search| select-string -pattern "T|"
}

目前,脚本只返回文件的整个内容而不是选择字符串。

基本上文件夹中的每个文件都有一个尾部记录,即T|1410我需要遍历所有文件并删除最后一行,其中一些文件将是200mb +有人可以指导我。

我已经编辑了我的脚本,现在我正在使用以下方法。

$path = "D:\Test\"
$filter =  "*.txt"
$files = Get-ChildItem -path $path -filter $filter

foreach ($item in $files)

{
            $search = Get-content $path$item
            ($search)| ForEach-Object { $_ -replace 'T\|[0-9]*', '' } | Set-Content $path$item
}

我正在使用Powershell v.2

但是,这是在我的文件末尾添加一个新的空行以及将替换为空,我怎样才能避免这种情况以及从底部开始搜索

enter image description here

3 个答案:

答案 0 :(得分:2)

-pattern "T|"

该模式匹配" T"或无。但是任何字符串中的每对字符之间都没有任何内容。要避免将|作为替换分隔符进行常规正则表达式处理,请使用反斜杠来匹配文字|

-pattern "T\|"

或者,使用Select-String' -SimpleMatch切换来停止将-Pattern作为正则表达式处理的参数。

答案 1 :(得分:2)

正如理查德所说,你必须逃脱|角色。

你也可以使用regex::escape功能:

[regex]::Escape("T|")

答案 2 :(得分:1)

除了转义字符外,您可以使用的另一个选项是-SimpleMatch开关。来自TechNet

  

使用简单匹配而不是正则表达式匹配。在简单匹配中,Select-String在输入中搜索Pattern参数中的文本。它不会将Pattern参数的值解释为正则表达式语句。

如果你不想担心逃避角色并且不使用正则表达式,那么这就是你要走的路。

$search | select-string -pattern "T|" -SimpleMatch