power shell在大文件中间插入文本(90MB)

时间:2017-10-04 19:44:02

标签: windows powershell

作为我们项目的一部分,我们从安全的sftp位置下载了大量的eml文件,下载后我们需要在每个下载文件中添加一个子标签,大约90 MB,我尝试使用PowerShell添加子标签我在其他网站上看过并粘贴在下面的脚本,它适用于10 kb到200kb的小文件,但是当我尝试使用相同的脚本来处理大文件脚本时,任何人都可以帮忙通过它。< / p>

(Get-Content F:\EmlProcessor\UnZipped\example.eml) | 
    Foreach-Object {
        $_ # send the current line to output
        if ($_ -match "x-globalrelay-MsgType: ICECHAT") 
        {
            #Add Lines after the selected pattern 
            " X-Autonomy SubTag=GMAIL"
        }
    } | Set-Content F:\EmlProcessor\EmlProcessor\example2.txt

样本EML文件

Date: Tue, 3 Oct 2017 07:44:32 +0000 (UTC)
From: XYZ
To: ABC
Message-ID: <1373565887.28221.1507075364517.JavaMail.tomcat@HKLVATAPP075>
Subject: Symphony: 2 users, 4 messages, duration 00:00
MIME-Version: 1.0
Content-Type: multipart/mixed; 
    boundary="----=_Part_28220_1999480254.1507075364517"

x-globalrelay-MsgType: GMAIL
x-symphony-StreamType: GMAIL
x-symphony-StreamID: RqN3HnR/ajgZvWOstxzLuH///qKcERyOdA==
x-symphony-ContentStartDateUTC: 1507016636610
x-symphony-ContentStopDateUTC: 1507016672387
x-symphony-FileGeneratedDateUTC: 1507075364516

------=_Part_28220_1999480254.1507075364517
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html><html><body><p><font color=3D"grey">Message ID: Un/pfFrGvvVy=
T6quhMBKjX///qEezwdFdA=3D=3D</font><br>2017-10-03T07:43:56.610Z  0

----
------
-----
</HTML>

如上面的示例输入文件所示,我必须添加一个文本&#34; X-Autonomy SubTab&#34;高于或低于&#34; x-globalrelay-MsgType&#34;。

我尝试将子标签添加到90 MB的示例文件中,正如所说的那样,虽然我的要求是通过循环遍历每个文件来添加近2K文件,我已经尝试使用上面的代码编写一个文件但是没有成功,我对批处理和批处理都很陌生。 Windows PowerShell脚本,任何快速帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您确定它会卡住还是需要更长时间?您的代码必须遍历数千行才能找到匹配项。

我没有要测试的大文本文件,因此将大型csv(60 MB)转换为txt,这对我来说非常快(10-15秒)。

注意:由于您是新手,并且您意识到PowerShell的强大功能,我将非常慷慨。大多数人会希望你自己付出一些努力,但我相信你至少会试着去了解剧本的作用。因为如果您使用直接在您的环境中访问的脚本而不进行测试,您最终可能会造成严重的损害。所以,至少为了测试,你会理解每一行的作用。我编辑了代码以使用函数实现可伸缩性。我可以使用多线程来加速进程,但由于这是一个繁重的CPU操作,我认为它不会有太大的好处。

#Coz functions are the best
Function Insert-SubTag ($Path)
{
    $FileName = $Path | Split-Path -Leaf
    $File = Get-Content -Path $Path
    $Line = $File | Select-String -Pattern "x-globalrelay-MsgType"
    $LineNumber = $Line.LineNumber

    #Since Linenumber starts from 1 but array count starts from 0
    $File[$LineNumber - 1] = "$Line
 X-Autonomy SubTag=GMAIL"

    $SavePath = "F:\EmlProcessor\UnZipped2\$FileName" #You can also pass the save folder as a parameter to this function like $path
    $File | Set-Content -Path $SavePath
}

#If you have the list of Files in a text file use this
$FileList = Get-content C:\FileList.txt

#If you have a folder, and want to iterate through each file, use this
$FileList = (Get-ChildItem -Path "F:\EmlProcessor\UnZipped").FullName

Foreach ($FilePath in $FileList)
{
    Insert-SubTag -Path $FilePath
}

假设x-globalrelay-MsgType仅在文本文件中出现一次。

如果适合您,请不要忘记选择此作为答案。