使用Get-Content cmdlet读取1000行(350KB)XML文件需要3分钟

时间:2019-07-15 08:27:47

标签: powershell

我写了一个脚本,它使用正则表达式检查文件中是否存在某些模式。 该脚本逐行读取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文件中。

0 个答案:

没有答案