3

I am having numerous web.config files. In which URL contains machine name.

This is my sample web.config file

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.Model>
<client>
      <endpoint address="http://MyMachineName:80/MyProj/Core/NewService/SecurityObject.0/Secretservice.svc" binding="basicHttpBinding" bindingConfiguration="MyProj_Internal_Routing" behaviorConfiguration="UserSIDBehavior" contract="SecurityMgmt.SecurityMgmtContract" name="HttpEndpointSecMgt" />
      <endpoint address="http://MyMachineName:80/MyProj/Core/DataObject/SystemCatalogs1.0/DataObjectservice/DataObjectservice.svc" binding="basicHttpBinding" bindingConfiguration="MyProj_Internal_Routing" behaviorConfiguration="UserSIDBehavior" contract="DataObjectservice.SystemCatalogsDataObjectservice" name="BasicHttpBinding_SystemCatalogsDataObjectservice" />
      <endpoint address="http://MyMachineName:80/MyProj/Core/NewService/Movement.0/Movement.svc" binding="basicHttpBinding" bindingConfiguration="MyProj_Internal_Routing" behaviorConfiguration="UserSIDBehavior" contract="NavigationClientLib.NavigationNewService" name="BasicHttpBinding_NavigationNewService" />
 </client>

 <system.Model>

 </configuration>

When user changes machine name this has to be updated in all the xml files.

I decided to write a function like this.

    Function Update-MachineName ([string] $FilePath,[string] $xpath, [string] $NewMachineName="NewComputer") {


    # Get the config file contents
    $WebConfig = [XML] (Get-content $Filepath)

    #Find the url using xpath which has old Machine name 
    $hostnameString= Select-XML -XML $WebConfig -XPath $Xpath

    Foreach ( $hostname in $hostnameString) { 

           if ( ($hostname.Node.value -match 'http') -eq $true ) {

               $hostname.Node.value
               $MachineOldName = $($($hostname.Node.value.split("/"))[2].split(":"))[0]
               $MachineOldName

               $hostname.Node.value.replace( $MachineOldName,$NewMachineName)

           }
    }

 $WebConfig.Save($FilePath)
}

Update-MachineName "C:\web.config" "//@address"

Though i replace with new machine name, still the web.config content doesn't updated. How to make it updated with the new Machine name

4 Answers 4

3

Your replacement value is not saved back on the node. Change this line:

$hostname.Node.value.replace( $MachineOldName,$NewMachineName)

To

$hostname.Node.value=$hostname.Node.value.replace( $MachineOldName,$NewMachineName)
Sign up to request clarification or add additional context in comments.

Comments

3

If it's only for replacing machine names in the XML structure you mentioned above, you don't really need to parse XML and use XPath...

$oldMachineName = "MyMachineName"
$newMachineName = "MyBrandNewMachineNAme"

$content = Get-Content -path $filePath
$content | foreach { $_.Replace($oldMachineName, $newMachineName) } | Set-Content $filePath

Comments

1

In your function, you must save the file back to the disk. You are manipulating with xml in memory, so changes will be visible only in the console, not in the actual file.

1 Comment

:I have added save function also but still no use ($WebConfig.Save($FilePath))
0

You can use like this:

$nodoEndpointSvcAddress = $($configXml.configuration.'system.serviceModel'.client.endpoint |  where { $_.name -eq "MyEndPoint1" })
[string]$endpointSvcAddress = $nodoEndpointSvcAddress.address
Write-Host $endpointSvcAddress

# Replace
$server = "test"
iif ($endpointSvcAddress.Contains($server))
{
    Write-Host "`r`nReplace $endpointSvcAddress"
    $nodoEndpointSvcAddress.address=$nodoEndpointSvcAddress.address.replace( $server,"PROSERVER")
    Write-Host ("Replaced " + $nodoEndpointSvcAddress.address)

}

$configXml.Save($pathCDR)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.