0

以前、Spiceworks コミュニティでこの質問をしたことがありますが、まだ回答がありません。よろしければ、ここで運試しをしたいと思います。だからここに行きます:

Powershell で XML ファイルを編集しています。私の編集のほとんどは、正規表現の結果から返されたもので更新している部分を除いて、完全に正常に機能します。

サンプルの 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"
    }

私が直面している問題は、配列内の各項目の値を Regex コマンドの結果に変更しようとしている ForEach ループ内にいるときです。変数 $c を作成し、正しい値を設定しているように見えますが、ForEach が処理している配列の現在の項目にその値を書き込むことはありません。

以下のコードのようなものも試しました(エラーが発生しました):

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

各カテゴリノードの値を更新しない理由はありますか?

4

1 に答える 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'
}
于 2013-08-09T07:41:12.620 に答える