作为我们项目的一部分,我们从安全的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脚本,任何快速帮助表示赞赏。
答案 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
仅在文本文件中出现一次。
如果适合您,请不要忘记选择此作为答案。