使用 PowerShell 替换 XML 文件中所有对象的值

时间:2021-04-14 12:20:27

标签: xml powershell

我有 XML 文件,内容如下:

<Tenants>
    <Tenant name="tenant_1" url="8s0n3lewbf7v.local" site="98074" path="\\1f7csgqde3l7.local\share\shared\98074" />
    <Tenant name="tenant_2" url="8s0n3lewbf7v.local" site="62761" path="\\1f7csgqde3l7.local\share\shared\62761" />
    <Tenant name="tenant_3" url="8s0n3lewbf7v.local" site="24387" path="\\1f7csgqde3l7.local\share\shared\24387" />
    <Tenant name="tenant_4" url="8s0n3lewbf7v.local" site="85670" path="\\1f7csgqde3l7.local\share\shared\85670" />
    <Tenant name="tenant_5" url="8s0n3lewbf7v.local" site="29117" path="\\1f7csgqde3l7.local\share\shared\29117" />
</Tenants>

tenants 块包含未知数量的对象,其中每个 path 需要更新。 path 具有 UNC 格式,该格式也是未知的。 任务是用变量 1f7csgqde3l7.local 和 URL {{1} 替换 path 块的每个 Tenants 中的服务器名称 $server(未知) }} 带有一个变量 8s0n3lewbf7v.local

使用 PowerShell 实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

可能不是最好的方法,但你可以试试

正则表达式获取 UNC 路径

[regex]$reg = "\\\\([a-z0-9_.$]+)\\"

以 XML 格式获取内容

[xml]$xml = Get-Content -Path xml_file.xml

遍历你的结构,它只是用你的 $url 替换匹配的 UNC

Foreach($x in $xml.Tenants.Tenant){
   $x.path = $x.path.Replace($reg.Match($x.path).Value,"\\$url\")
}

并保存

$xml.Save("xml_file.xml")

答案 1 :(得分:1)

如果我理解正确的话,您正在寻找这样的东西:

$xml = [xml]'<Tenants>
    <Tenant name="tenant_1" url="8s0n3lewbf7v.local" path="\\1f7csgqde3l7.local\share\shared\98074_prod" />
    <Tenant name="tenant_2" url="8s0n3lewbf7v.local" path="\\1f7csgqde3l7.local\share\shared\62761_prod" />
    <Tenant name="tenant_3" url="8s0n3lewbf7v.local" path="\\1f7csgqde3l7.local\share\shared\24387_prod" />
    <Tenant name="tenant_4" url="8s0n3lewbf7v.local" path="\\1f7csgqde3l7.local\share\shared\85670_prod" />
    <Tenant name="tenant_5" url="8s0n3lewbf7v.local" path="\\1f7csgqde3l7.local\share\shared\29117_prod" />
</Tenants>
'
$new_server = "abcd123cde56"
$new_url="123456789asd.local"

$nodes = $xml.SelectNodes(".//Tenants//Tenant");
foreach($node in $nodes) {
    $target_path =  $node.GetAttribute("path")
    $delim = ".lo"
    $name = $target_path -split $delim
    $newname = -join("\\",$new_server,$delim ,$name[1]);    
    $node.SetAttribute("path", $newname);
    $node.SetAttribute("url", $new_url);
}

结果应该是

<Tenants>
  <Tenant name="tenant_1" url="123456789asd.local" path="\\abcd123cde56.local\share\shared\98074_prod" />
  <Tenant name="tenant_2" url="123456789asd.local" path="\\abcd123cde56.local\share\shared\62761_prod" />
  <Tenant name="tenant_3" url="123456789asd.local" path="\\abcd123cde56.local\share\shared\24387_prod" />
  <Tenant name="tenant_4" url="123456789asd.local" path="\\abcd123cde56.local\share\shared\85670_prod" />
  <Tenant name="tenant_5" url="123456789asd.local" path="\\abcd123cde56.local\share\shared\29117_prod" />
</Tenants>
相关问题