如何使用PowerShell Replace

时间:2019-05-14 22:51:17

标签: powershell replace

我只是想规范化json文件中的值,该值稍后将在管道中用作ARM模板的参数文件。

我已经尝试通过单独调用每个替换项以及通过链式调用所有替换项来使用“ -Replace”参数和“ .Replace”方法。结果总是相同的,而且不是我期望的。

以下代码...

$TestFile = Get-Content -Path $ParameterPath -Raw

Write-Host "Replacing $($GeoTag) with $($GeographicTag)"
$TestFile = $TestFile.Replace($GeoTag, $GeographicTag)

Write-Host "Replacing $($RegionName01) with $($PrimaryRegion)"
$TestFile = $TestFile.Replace($RegionName01, $PrimaryRegion)

Write-Host "Replacing $($RegionName02) with $($SecondaryRegion)"
$TestFile = $TestFile.Replace($RegionName02, $SecondaryRegion)

Write-Host "Replacing $($AzLocation01) with $($PrimaryLocation)"
$TestFile = $TestFile.Replace($AzLocation01, $PrimaryLocation)

Write-Host "Replacing $($AzLocation02) with $($SecondaryLocation)"
$TestFile = $TestFile.Replace($AzLocation02, $SecondaryLocation)

Set-Content -Path $ParameterPath -Value $TestFile -NoNewLine

在控制台中产生以下预期结果...

Replacing aS with AS
Replacing eaST with East
Replacing SouthEast with Southeast
Replacing EAST AsIa with eastasia
Replacing SoutH EAST AsIa with southeastasia

但是随后出现以下意外导致文件...

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "geoTag": {
            "value": "AS"
        },
        "regionName01": {
            "value": "eAST"
        },
        "regionName02": {
            "value": "Southeast"
        },
        "azLocation01": {
            "value": "eastasia"
        },
        "azLocation02": {
            "value": "SoutH eastasia"
        }
    }
}

为什么在文件中将“ eaST”替换为“ eAST”而不是“ East”?

为什么文件中的“ SoutH EAST AsIa”被“ SoutH eastasia”代替,而不是“ southeastasia”?

事实上,我们知道PowerShell变量具有正确的值,但是由于某种我不知道的原因,替换发生的方式很怪异,并且在json文件中没有得到期望的值。

1 个答案:

答案 0 :(得分:0)

没关系,问题出在我的逻辑上。 发布后我才意识到这一点。

第一个替换项,除了将“ aS”转换为“ AS”外,还将“ eaST”转换为“ eAST”,现在与第二个替换项不匹配,因此保持不变。

第4次替换,除了将“ EAST AsIa”变成“ eastasia”外,还将“ SoutH EAST AsIa”转变成“ SoutH eastasia”,现在与第5次替换不匹配,因此保持不变。

我的逻辑有缺陷,但至少我的测试数据指出了这一点。通过在替换匹配项中包含双引号,我设法使其正常工作:

$TestFile = $TestFile.Replace("`"$($GeoTag)`"","`"$($GeographicTag)`"")
$TestFile = $TestFile.Replace("`"$($RegionName01)`"","`"$($PrimaryRegion)`"")
$TestFile = $TestFile.Replace("`"$($RegionName02)`"","`"$($SecondaryRegion)`"")
$TestFile = $TestFile.Replace("`"$($AzLocation01)`"","`"$($PrimaryLocation)`"")
$TestFile = $TestFile.Replace("`"$($AzLocation02)`"","`"$($SecondaryLocation)`"")