Я ранее задавал этот вопрос в сообществе 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]
}
Любые идеи, почему это не обновляет значение каждой категории узла?
Это было так близко. Решение было правильным, но у вас была опечатка, вы пропустили знак подчеркивания в правой части = Спасибо вам большое. Я никогда не думал об использовании выбранных узлов (еще новичок в редактировании xml с помощью PowerShell) – chamele0n
Действительно, я это сделал. Теперь это исправлено. –