需要一种方法,在Poweshell中找到字符串后,将文件的剩余数据写入文件。

14 浏览
0 Comments

需要一种方法,在Poweshell中找到字符串后,将文件的剩余数据写入文件。

我有一个大文件(250 GB),我需要搜索一个字符串,一旦找到它,我需要复制从该行到文件末尾的所有内容。\n示例文件:\n

Bird
Lion
Tiger
Jaguar
Frog
Snake

\n结果应该是:\n

Jaguar
Frog
Snake

\n我是PowerShell的新手,尝试了下面的代码,但只能找到字符串Jaguar并打印它,我需要获取后续的行。\n

Get-Content -Path "C:\Dump\test1.txt" |
Select-String 'Jaguar' |
Set-Content -Path "C:\Dump\test2.txt"

0
0 Comments

文章标题:在PowerShell中查找字符串并将文件剩余数据写入的解决方法

在PowerShell中,有时候我们需要在找到特定字符串后,将该字符串之后的文件内容写入到另一个文件中。本文将介绍一个简单易懂的函数来实现这个功能,并提供了相关的代码示例。

首先,我们创建了一个名为"Get-Content-Since-Equals-To-File"的函数,该函数可以用于处理大文件。函数的参数包括文件路径($Path),要查找的字符串($LineText),以及新文件的路径($PathNewFile)。函数的具体实现如下所示:

function Get-Content-Since-Equals-To-File(){
    param (
        [string] $Path,        
        [string] $LineText,
        [string] $PathNewFile
    )
    $writer  = [System.IO.StreamWriter]::new($PathNewFile)
    $continue=0
    foreach($line in [System.IO.File]::ReadLines($Path))
    {    
        if($line.Equals($LineText)){$continue=1}
        if( $continue -eq 1){
            $writer.WriteLine($line);
        }
    }
    $writer.Dispose();    
}

通过调用这个函数,我们可以很方便地实现文件内容的提取。只需传入文件路径、要查找的字符串和新文件的路径即可。示例如下:

Get-Content-Since-Equals-To-File -Path ./1.txt "Jaguar" -PathNewFile './newFile.txt'

上述代码会生成一个包含所需结果的新文件(请注意,这里示例中使用的是相对路径,实际应用中应使用绝对路径并考虑工作目录)。

Get-Content ./newFile.txt
Jaguar
Frog
Snake

该函数基于Stack Overflow上的一个问题“Read file line by line in PowerShell”,它可以逐行读取文件内容,因此适用于处理大文件。

如果你不仅仅需要匹配字符串,还可以根据其他条件来适应这个函数。

在这里,我们还要感谢对Add-Content的改进,我们通过使用StreamWriter进行了代码的更新。

如果你想解决相对路径的问题,可以将`[System.IO.StreamWriter]::new($PathNewFile)`替换为`[System.IO.StreamWriter]::new((Convert-Path -LiteralPath $PathNewFile))`。此外,建议使用`[bool]`类型的变量来表示布尔值,例如`$continue = $false`或`$continue = $true`,并使用`if ($continue) ...`进行条件判断。

通过以上的解决方案,我们可以在PowerShell中找到特定字符串并将文件剩余数据写入另一个文件,从而满足我们的需求。

0
0 Comments

问题的原因是由于文件很大,需要一种方法在找到字符串后将文件的剩余数据写入另一个文件。解决方法是使用PowerShell中的switchStreamWriter

下面是解决问题的代码:

$writer  = [System.IO.StreamWriter]::new('C:\Dump\test2.txt')
$foundMarker = $false
switch -Regex -File 'C:\Dump\test1.txt' {
    '\bJaguar\b' { $foundMarker = $true; $writer.WriteLine($_) }
    default { if ($foundMarker) { $writer.WriteLine($_) } }
}
# 清理资源
$writer.Dispose()

在代码中,使用\b将关键字Jaguar包围起来,使其成为一个“整词”搜索。如果需要关键字区分大小写,可以在switch语句中添加CaseSensitive选项。

代码中还包括了资源的清理,调用.Dispose()方法会隐式地刷新缓冲区,因此不需要显式调用.Flush()方法。

通过以上方法,可以在找到关键字后将文件的剩余数据写入另一个文件。

0