我有很多web.config文件。在哪个URL中包含计算机名称。
这是我的示例web.config文件
<?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>
当用户更改机器名称时,必须在所有xml文件中更新。
我决定写一个这样的函数。
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"
虽然我用新的机器名替换,但web.config内容仍未更新。如何使用新计算机名称进行更新
答案 0 :(得分:3)
如果只是替换上面提到的XML结构中的机器名,那么你真的不需要解析XML并使用XPath ......
$oldMachineName = "MyMachineName"
$newMachineName = "MyBrandNewMachineNAme"
$content = Get-Content -path $filePath
$content | foreach { $_.Replace($oldMachineName, $newMachineName) } | Set-Content $filePath
答案 1 :(得分:3)
您的替换值未保存在节点上。改变这一行:
$hostname.Node.value.replace( $MachineOldName,$NewMachineName)
要
$hostname.Node.value=$hostname.Node.value.replace( $MachineOldName,$NewMachineName)
答案 2 :(得分:1)
在您的功能中,您必须将文件保存回磁盘。您正在使用内存中的xml进行操作,因此更改只能在控制台中显示,而不能在实际文件中显示。
答案 3 :(得分:0)
您可以这样使用:
$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)