2013-08-08 3 views
0

Я ранее задавал этот вопрос в сообществе Spiceworks, но пока не получил ответов. Если вы, ребята, не против, я хотел бы попробовать свою удачу здесь. Итак, вот так:Обновление Powershell объектов массива в файле XML

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

Вот типовой раздел XML:

<?xml version="1.0" encoding="utf-8"?> 
<assetPackages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; verb=""> 
    <assetPackage asset_name="JackalCLSDMP0802title" type="VOD" providerID="starzencore.com" providerName="MOVIEPLEX" creationDate="2013-07-11" product="MOD" version="1" verb=""> 
     <metadata> 
      <assetID>TITL0020000000864577</assetID> 
      <providerID>starzencore.com</providerID> 
      <title language="en">The Jackal</title> 
      <sortTitle language="en">The Jackal</sortTitle> 
     <reducedTitle language="en">The Jackal</reducedTitle> 
      <summary language="en">Summary is Long</summary> 
      <shortSummary language="en">Shorter Summary</shortSummary> 
      <flag>ClosedCaptioning</flag> 
      <rating rating_system="MPAA" value="R" /> 
      <runTimeMinutes>125</runTimeMinutes> 
      <release_year>1997</release_year> 
      <countryRegionCode>us</countryRegionCode> 
      <person role="director" lname="Caton-Jones" fname="Michael" mname="" /> 
      <person role="actor" lname="Willis" fname="Bruce" mname="" /> 
      <person role="actor" lname="Gere" fname="Richard" mname="" /> 
      <studio>UNIVERSAL PAY TELEVISION</studio> 
      <category>Premium Channels/Movieplex/All Movies</category> 
      <category>Premium Channels/Movieplex/Drama</category> 
      <category>Premium Channels/Movieplex/Top Hits</category> 
      <targetingProfileId>MoviePlex_VOD</targetingProfileId> 
     </metadata> 
    </assetPackage> 
</assetPackages> 

А вот мой текущий фрагмент кода:

$TempXML = @(Get-ChildItem $tempDir -recurse -filter "Metadata.xml" | Where-Object {$_.FullName -like "*$($like)*"}) 

    $Results = @() 

    ### Edit XML Process 
    ForEach ($File in $tempXML) 
    { 
     $xmlData = [xml](Get-Content "\\Wtcvhovmgmt001\Staging\starzencore.com-TITL0020000000864577\metadata.xml") #(Get-Content $File.Fullname) 
     $xmli = $xmlData.assetpackages.assetpackage 

     #Regex to replace string in metadata category 
     ForEach ($c in ($xmli.metadata.category)) 
     { 
      if ({ $c -notlike "*Subscriptions*" }) 
      { 
       $regex = "^[^/]*(.*)$" 
       $c -match $regex 
       $c = "Subscriptions" + $matches[1] 
       #$c 
      } 
     } 
     $xmlData.Save("\\Wtcvhovmgmt001\Staging\starzencore.com-TITL0020000000864577\metadata.xml") #$xmlData.Save($File.Fullname) 

     $DirName = Split-Path (Split-Path $file.Fullname -Parent) -Leaf 
     $Results += New-Object PSObject -Property @{ 
      "Date/Time" = $Date 
      File = $($file.FullName) 
      "Last Write Time" = $($file.LastWriteTime) 
      Directory = $($DirName) 
      Status = "Successful" 
      } 
     Write-Host "Succesfully processed $($File.Fullname)" -foregroundcolor green -backgroundcolor black 

     #Write event to event log for successful metadata editing 
     #Write-Eventlog -ComputerName "WTCVHOVCTRL001" Application -source "Microsoft IPTV" -eventid 14888 -message "Successfully edited/updated $($File.Fullname). File is ready for reimport" 
    } 

Проблема Я бегу в том, что когда я нахожусь внутри цикла ForEach попытки изменить значение каждого элемента в массиве на результаты команды Regex. Кажется, создается переменная $ c, заполняет ее правильным значением, но затем никогда не записывает это значение в текущий элемент массива, который обрабатывает ForEach.

Я также попытался что-то вроде кода ниже (который произвел ошибки):

#Regex to replace string in metadata category 
$xmli.metadata.category | ForEach-Object 
{ 
    $regex = "^[^/]*(.*)$" 
    $_ -match $regex 
    $_ = "Subscriptions" + $matches[1] 
} 

Любые идеи, почему это не обновляет значение каждой категории узла?

ответ

1

Вместо этого:

$xmli = $xmlData.assetpackages.assetpackage 

#Regex to replace string in metadata category 
ForEach ($c in ($xmli.metadata.category)) 
{ 
    if ({ $c -notlike "*Subscriptions*" }) 
    { 
     $regex = "^[^/]*(.*)$" 
     $c -match $regex 
     $c = "Subscriptions" + $matches[1] 
     #$c 
    } 
} 

попробовать это:

$xmli.SelectNodes('//category[not(starts-with(.,"Subscriptions"))]') | % { 
    $_.'#text' = $_.'#text' -replace '^[^/]*(.*)$', 'Subscriptions$1' 
} 
+0

Это было так близко. Решение было правильным, но у вас была опечатка, вы пропустили знак подчеркивания в правой части = Спасибо вам большое. Я никогда не думал об использовании выбранных узлов (еще новичок в редактировании xml с помощью PowerShell) – chamele0n

+0

Действительно, я это сделал. Теперь это исправлено. –

Смежные вопросы