我写了一个脚本,它使用正则表达式检查文件中是否存在某些模式。 该脚本逐行读取XML文件,并检查该模式是否存在。如果是这样,那么它将接受该行并将其添加到列表中。之后,它将列表保存到另一个文件。
脚本可以完成其工作,但是速度非常慢。仅读取1000行XML文件大约需要3分钟。我已经在两台机器上检查了脚本。
我发现Get-Content
cmdlet对于大型文件(50MB及以上)不是很有效,但是对于像我这样的小型文件应该足够有效。
这是我编写的代码(Windows 10,Powershell v5.1):
$xmlFile = "C:\Dane\VSCrepo\Generator_Infa\impex\migrate\files_to_migrate\wf_TEST.xml"
$TemplateFile = "C:\Dane\VSCrepo\Generator_Infa\impex\migrate\ControlFile_temp.xml"
$OutputFile = "C:\Dane\VSCrepo\Generator_Infa\impex\migrate\ControlFile.xml"
$xmlText = Get-Content $xmlFile
# Read file
[String[]] $NewLines = @()
foreach ($Line in $xmlText) {
if ($Line -match '.*FOLDER *NAME ="\w+".*') {
$FolderName = $Line -replace '.*FOLDER *NAME ="(\w+)".*', '$1'
$NewLines += "<FOLDERMAP SOURCEFOLDERNAME=`"$FolderName`" SOURCEREPOSITORYNAME=`"REP_DEV`" TARGETFOLDERNAME=`"$FolderName`" TARGETREPOSITORYNAME=`"REP_TEST`"/>"
}
}
$TemplateText = Get-Content $TemplateFile
# Write file
[String[]] $OutputText = @()
foreach ($Line in $TemplateText) {
$OutputText += $Line
if ($Line -match ".*<IMPORTPARAMS CHECKIN.*") {
#Add Lines after the selected pattern
$OutputText += $NewLines
}
}
Set-Content $OutputFile $OutputText
您是否有任何简便的方法可以提高代码性能,而无需使用.Net类或其他疯狂的东西?
更新:
XML文件示例:
<FOLDER NAME="XXXX" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<blah blah blah>
<yeah yeah yeah>
<SHORTCUT FOLDERNAME="AAA" FOO="BLAH" BAR="BLAH"/>
<.../>
</FOLDER>
<FOLDER NAME="YYYYY" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<blah blah blah>
<yeah yeah yeah>
<SHORTCUT FOLDERNAME="BBB" FOO="BLAH" BAR="BLAH"/>
<.../>
</FOLDER>
<FOLDER NAME="ZZZZ" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<blah blah blah>
<yeah yeah yeah>
<SHORTCUT FOLDERNAME="CCC" FOO="BLAH" BAR="BLAH"/>
<.../>
</FOLDER>
正则表达式匹配-match '.*FOLDER *NAME ="\w+".*'
选择以下行:
<FOLDER NAME="XXXX" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<SHORTCUT FOLDERNAME="AAA" FOO="BLAH" BAR="BLAH"/>
<FOLDER NAME="YYYYY" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<SHORTCUT FOLDERNAME="BBB" FOO="BLAH" BAR="BLAH"/>
<FOLDER NAME="ZZZZ" GROUP="" OWNER="idwbicc" SHARED="NOTSHARED" DESCRIPTION="" PERMISSIONS="rwx---r--" UUID="a33b65ea-7e70-4b3c-8dff-e6987d013fd2">
<SHORTCUT FOLDERNAME="CCC" FOO="BLAH" BAR="BLAH"/>
正则表达式替换-replace '.*FOLDER *NAME ="(\w+)".*', '$1'
从选择的文件夹名称中提取
XXXX AAA YYYYY BBB ZZZZ CCC
每个文件夹名称位于:
<FOLDERMAP SOURCEFOLDERNAME="$FolderName" SOURCEREPOSITORYNAME="REP_DEV" TARGETFOLDERNAME="$FolderName" TARGETREPOSITORYNAME="REP_TEST"/>
新创建的行列表将插入输出XML文件中。