Измените XML-теги в PowerShell и сохраняйте содержимое. - PullRequest
2 голосов
/ 15 декабря 2011

Я экспортировал данные из EventLog, используя PowerShell, и создал образец схемы для импорта данных в SQL, однако существует проблема способа экспорта данных из PowerShell с помощью ConvertToXML.

Экспорт XML выглядит следующим образом;

<Property Name="Version">0</Property>

<Property Name="Qualifiers" />

<Property Name="Level">0</Property>

<Property Name="Task">14339</Property>

<Property Name="Opcode">0</Property>

<Property Name="Keywords">-9218868437227405312</Property>

<Property Name="RecordId">57963203</Property>

<Property Name="ProviderName">Microsoft-Windows-Security-Auditing</Property>

Но это должно выглядеть примерно так;

<Version>0</Version>

<Qualifiers> />

<Level>0</Level>

<Task>14339</Task>

Приведенный ниже код идентифицирует начало и конец версии имени свойства и тега свойства. и пытается изменить его на, но, к сожалению, он меняет его без сохранения содержимого в теге. Я не могу сохранить значение.

$EventLog = (Get-WinEvent -ComputerName xxxxxxx-FilterXML $Query) | ConvertTo-Xml -NoTypeInformation

$EventLogModify = (Get-Content P:\EventTracking\Events.xml) | foreach{$_ -replace '(<Property Name=""Version"">(.*?)</Property>)', "<Version></Version>" };Set-Content P:\EventTracking\Events.xml $EventLogModify;

Ответы [ 2 ]

3 голосов
/ 15 декабря 2011

Ваша проблема в

-replace '(<Property Name=""Version"">(.*?)</Property>)', "<Version></Version>"

Вы заменяете полный тег пустым тегом.Я предполагаю, что вы хотите использовать захваченную группу в качестве замены:

-replace '(<Property Name=""Version"">(.*?)</Property>)', '<Version>$2</Version>'

Кроме того, вы, вероятно, использовали двойные кавычки в регулярном выражении ранее, потому что там есть "".Скорее всего, это ничего не будет соответствовать, потому что теперь он ищет две двойные кавычки подряд.

Еще одна вещь, вы, вероятно, хотите заменить все сразу, поэтому используйте это возможно:

-replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>'

Однако этого недостаточно:

PS> $xml -replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>'
<Version>0</Version>
<Property Name="Qualifiers" />
<Level>0</Level>
<Task>14339</Task>
<Opcode>0</Opcode>
<Keywords>-9218868437227405312</Keywords>
<RecordId>57963203</RecordId>
<ProviderName>Microsoft-Windows-Security-Auditing</ProviderName>

Как видите, Qualifiers все еще не изменился.Итак, другая замена:

-replace '<Property Name="([^"]+)"\s*/>','<$1/>'

выглядит лучше

PS> $xml -replace '<Property Name="([^"]+)">([^<]+)</Property>', '<$1>$2</$1>' -replace '<Property Name="([^"]+)"\s*/>','<$1/>'
<Version>0</Version>
<Qualifiers/>
<Level>0</Level>
<Task>14339</Task>
<Opcode>0</Opcode>
<Keywords>-9218868437227405312</Keywords>
<RecordId>57963203</RecordId>
<ProviderName>Microsoft-Windows-Security-Auditing</ProviderName>
0 голосов
/ 16 декабря 2011

другой простой способ:

[Xml]$xml=@'
<root>
<Property Name="Version">0</Property>
<Property Name="Qualifiers" />
<Property Name="Level">0</Property>
<Property Name="Task">14339</Property>
<Property Name="Opcode">0</Property>
<Property Name="Keywords">-9218868437227405312</Property>
<Property Name="RecordId">57963203</Property>
<Property Name="ProviderName">Microsoft-Windows-Security-Auditing</Property>
</root>
'@



$xml.SelectNodes('//Property') | ForEach `
 -begin { 
       $h = New-Object xml
       $r = $h.CreateElement("ROOT")
       $null=$h.AppendChild($r)
   } `
 -process {
     if($_.'#text') {
         $n = $h.CreateElement($_.Name)
         $n.InnerText = $_.'#text'
         $null=$r.AppendChild($n)
     }
     else {
        $n = $h.CreateElement($_.Name)
        $null=$r.AppendChild($n)
      }
    } `
 -End {
      $h.OuterXml
      }

или

$xml.SelectNodes('//Property')|% {
if($_.'#text') { "<{0}>{1}</{0}>" -f $_.name,$_.'#text' } else {"<$($_.name)/>"}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...