需要一种方法,在Poweshell中找到字符串后,将文件的剩余数据写入文件。
需要一种方法,在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"
文章标题:在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中找到特定字符串并将文件剩余数据写入另一个文件,从而满足我们的需求。
问题的原因是由于文件很大,需要一种方法在找到字符串后将文件的剩余数据写入另一个文件。解决方法是使用PowerShell中的switch
和StreamWriter
。
下面是解决问题的代码:
$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()
方法。
通过以上方法,可以在找到关键字后将文件的剩余数据写入另一个文件。