2015-04-18 66 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多個更新。 –