简体   繁体   中英

Powershell using -replace to edit a portion of text in a node?

I am trying to write a powershell script using -replace or something equivalent to search a specified node, based on conditions, and replace only a portion of the text with other text. Is this even possible?

Here is some example nodes I am trying to edit based on the value of 'Path':

<Configuration ConfiguredType="Property" Path="\Package.Variables[User::var1].Properties[Value]" 
    ValueType="String">
        <ConfiguredValue>Some Text Here</ConfiguredValue>
</Configuration>

<Configuration ConfiguredType="Property" Path="\Package.Variables[User::var2].Properties[Value]" 
    ValueType="String">
        <ConfiguredValue>More Text Here</ConfiguredValue>
</Configuration>

Below is my current code setup to replace the entire string but id prefer for it to replace "text" with "content" so the node will now say "Some Content Here". I tried using -replace but I could not get it to work properly.

#defaults
$xml = [xml](Get-Content $file.FullName)
$node = $xml.DTSConfiguration.Configuration

#updating individual attributes

$pathVar = "var1"
$confVal = ""
($xml.DTSConfiguration.Configuration | Where-Object {$_.Path -like ("*{0}*" -f $pathVar)}).ConfiguredValue = ("{0}" -f $confVal)
$xml.Save($file.FullName)

When working with XML data XPath is usually the most versatile way of accessing nodes and their attributes. In your case you want to select the <ConfiguredValue> child node of a <Configuration> node whose Path attribute contains the substring defined in the variable $pathVar .

$xpath = "//Configuration[contains(@Path, '$pathVar')]/ConfiguredValue"
$node  = $xml.SelectSingleNode($xpath)
$node.'#text' = $node.'#text'.Replace('Text', 'Content')

Beware that both XPath expressions and the Replace() method are case-sensitive.

Using the -replace operator (which is case-insensitive by default) is also possible:

$node.'#text' = $node.'#text' -replace 'Text', 'Content'

The Replace() method provides better performance, though, because it does simple string replacements whereas the -replace operator does regular expression replacements.

If I understand your question you are replacing a string token with a string value.

If that is true you can treat the xml as a string and do a replace like below:

$token = 'text'
$value = 'content'
$content = Get-Content $file.FullName
$content = $content.Replace($token, $value)
$content | Out-File $file.FullName

Keep in mind your token should be unique because it will replace all instances of the token.

If you cannot identify a unique token you can do a replace on the string after you select the value from the xml path.

(($xml.DTSConfiguration.Configuration | Where-Object {$_.Path -like ("*{0}*" -f $pathVar)}).ConfiguredValue = ("{0}" -f $confVal)).Replace('text','content')

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM