2015-04-18 30 views
0

我想解析XML文件在关键字定义的目录中。 如果找到关键字,则应先替换它以避免进一步匹配,然后将xml的内容作为事件的消息部分发送。Powershell XML解析和写入事件查看器

主要问题在于最后一个代码块,它将逐行解析.xml而不是块。

#### THIS CODE GETS ALL THE FILES THAT CONTAINS THE "Major" Pattern 
$Path = "C:\test\" 
$SearchFor = "Major" 
$TestFor = "parsedxml" 
$Parse = "ParsedXML" 
$PathArray = @() 
$FolderFile = "C:\test\*.xml" 
$found = @() 

# This code snippet gets all the files in $Path that end in ".xml". 
Get-ChildItem $Path -Filter "*.xml" | Select-String -Pattern "Major" 
ForEach-Object { 
    If (Get-Content $FolderFile | Select-String -Pattern 
"Major","Parsedxml") 
    { 


    } 
    } 

#### THIS WORKS TO CHANGE THE KEYWORD IN THE FILE ### 
Get-ChildItem C:\test\*.xml -recurse | ForEach { 
    (Get-Content $_ | ForEach {$_ -replace "Major", "Parsed"}) | Set-Content $_ 
} 


### THIS WORKS (KINDA) TO PARSE THE FILE INTO AN EVENTLOG ### 
### BUT IT PARSES THE .XML LINE BY LINE FOR SOME REASON #### 
Get-ChildItem C:\test\*.xml | ForEach { 
(Get-Content $_)| ForEach { Write-EventLog –LogName Application –Source “Verint Alert” –EntryType Information –EventID 1 -Message ("Triggered Alarm" + ($_)) 
    } 
    } 

但我似乎无法使代码执行以下操作: 读取该文件,如果它包含“主要”分析整个.XML作为“写入事件日志-Message”,一旦被解析,变化关键字Major到Parsed这个词。通过文件$的每一行

(Get-Content $_)| ForEach { ... } 

将循环_:

+0

顺便说一句,我很确定你的“主要”模式是在一个特定的XML标签中,你应该能够使用XML格式和XPath工作而不是原始的gc和选择字符串 –

+0

还不熟悉XPath ..这是我被扔在我身上,我不得不尝试快速皮卡.. – Delaney

回答

1

您的代码逐行地读取,因为你自找的。

,所以我想你会喜欢:

Get-ChildItem C:\test\*.xml | ForEach { 
Write-EventLog –LogName Application –Source “Verint Alert” ` 
    –EntryType Information –EventID 1 ` 
    -Message ("Triggered Alarm" + (Get-Content $_)) 
} 

顺便说一句,你还需要筛选你正在使用的文件。

编辑有关筛选:

地说您有类似<status>Major</status>在文件

$xmlfile=$_ 
$xml=[xml] (gc $xmlfile) 
if ($xml.SelectSingleNode("//status").'#text' -eq "Major") { 
    # Write-EventLog... 
    $xml.SelectSingleNode("//status").'#text' = 'Parsed' 
    $xml.Save($xmlfile) 
} 
+0

所以我不能只通过* .XML处理所有的xml? 我该如何过滤它们呢? – Delaney

+0

这是超级有用的..让我通过一个障碍,尽可能解析文件的整体..但我将如何“过滤”每个文件? – Delaney

+0

过滤是另一个问题,特别是在SO中。我仍然添加了我的代码片段,以便为您提供Keith Hill的普通版本以外的其他路径 –

0

另一条路线走的是:

foreach ($file in (Get-ChildItem c:\test\*.xml)) { 
    $content = [IO.File]::ReadAllText($file.FullName) 
    if ($content -match 'Major') { 
     Write-Event -LogName Application -Source 'Verint Alert' ` 
        -EntryType Information -EventId 1 ` 
        -Message "Triggered Alarm $content"; 
     $content -replace 'Major','Parsed' | Out-File $file.FullName 
    } 
} 

在PowerShell中V2你没有-Raw参数Get-Content将文件读取为单个字符串。你可以使用[IO.File] :: ReadAllText()来代替。

+0

我仅限于Powershell 2.0 – Delaney

+0

已针对PowerShell 2.0进行了更新。 –

+0

BTW V2现在大约6岁,很快会变成3转。只是说':-)对于旧转速获得帮助有点困难。我围绕虚拟机,以便我可以检查旧版本的东西,但这是一个痛苦。现在我正在等待我的V2虚拟机完成安装50多个更新。 –