Powershell XML 解析并写入事件查看器
Powershell XML Parsing and writing to the event viewer
我正在尝试解析定义了关键字的目录中的 XML 个文件。
如果找到关键字,应首先替换它以避免进一步匹配,然后 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" + ($_))
}
}
但我似乎无法让代码执行以下操作:
读取文件,如果它包含 "Major" 将整个 .xml 解析为 "Write EventLog -Message" 并在解析后,将关键字 Major 更改为 Parsed.
您的代码逐行读取,因为您要求它:
(Get-Content $_)| ForEach { ... }
将遍历文件 $_ 的每一行。
所以我想你更喜欢:
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)
}
另一条路线是:
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 中,您没有 Get-Content 上的 -Raw 参数来将文件作为单个字符串读取。您可以改用 [IO.File]::ReadAllText()。
我正在尝试解析定义了关键字的目录中的 XML 个文件。 如果找到关键字,应首先替换它以避免进一步匹配,然后 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" + ($_))
}
}
但我似乎无法让代码执行以下操作: 读取文件,如果它包含 "Major" 将整个 .xml 解析为 "Write EventLog -Message" 并在解析后,将关键字 Major 更改为 Parsed.
您的代码逐行读取,因为您要求它:
(Get-Content $_)| ForEach { ... }
将遍历文件 $_ 的每一行。
所以我想你更喜欢:
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)
}
另一条路线是:
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 中,您没有 Get-Content 上的 -Raw 参数来将文件作为单个字符串读取。您可以改用 [IO.File]::ReadAllText()。