替换文件中的多行

Replacing multiple lines in a file

我试着做,第一个数组中的行是从文件中读取的,并被第二个数组中的行替换,所以有时会有不同的行。我做了一个脚本,但我不明白为什么它不起作用。

$OldStrings = @(
    "desktopwidth:i:1440",
    "desktopheight:i:900",
    "winposstr:s:0,1,140,60,1596,999"
)
$NewStrings = @(
    "desktopwidth:i:1734",
    "desktopheight:i:990",
    "winposstr:s:0,1,50,7,1800,1036"
)

$LinesArray = Get-Content -Path 'C:\temp\My Copy\Default.rdp'
$LinesCount = $LinesArray.Count
for ($i=0; $i -lt $LinesCount; $i++) {
    foreach ($OldString in $OldStrings) {
        foreach ($NewString in $NewStrings) {
            if ($LinesArray[$i] -like $OldString) {
                $LinesArray[$i] = $LinesArray[$i] -replace $OldString, $NewString
                Write-Host "`nline" $i "takes on value:" $LinesArray[$i] "`n" -ForegroundColor Gray
            }
        }
    }
}

文件可能是根本没有被读取的原因。

执行脚本后,只看到

第 2 行取值:desktopwidth:i:1734

第 3 行取值:desktopwidth:i:1734

第 5 行取值:desktopwidth:i:1734

您正在查看字符串数组两次。你想做两个循环,一个循环用于文件中的每一行,另一个循环用于你要替换的行中的每个计数。我认为这应该有效:

$OldStrings = @(
"desktopwidth:i:1440",
"desktopheight:i:900",
"winposstr:s:0,1,140,60,1596,999"
)
$NewStrings = @(
"desktopwidth:i:1734",
"desktopheight:i:990",
"winposstr:s:0,1,50,7,1800,1036"
)

$LinesArray = Get-Content -Path 'C:\temp\My Copy\Default.rdp'

# loop through each line
for ($i=0; $i -lt $LinesArray.Count; $i++)
{
    for ($j=0;$j -lt $OldStrings.Count; $j++)
    {
        if ($LinesArray[$i] -match $OldStrings[$j])
        {
            $LinesArray[$i] = $LinesArray[$i] -replace $OldStrings[$j],$NewStrings[$j]
            Write-Host "`nline" $i "takes on value:" $LinesArray[$i] "`n" -ForegroundColor Gray
        }
    }
}

$LinesArray | Set-Content -Path 'C:\temp\My Copy\Default.rdp'

您无需费心检查行来查找匹配项。由于您已经准备好替换件,所以无论如何都要直接进行替换。这样也应该更快。

$stringReplacements = @{
    "desktopwidth:i:1440" = "desktopwidth:i:1734"
    "desktopheight:i:900" = "desktopheight:i:990"
    "winposstr:s:0,1,140,60,1596,999" = "winposstr:s:0,1,50,7,1800,1036"
}
$path = 'C:\temp\My Copy\Default.rdp'
# Read the file in as a single string.
$fileContent = Get-Content $path | Out-String
# Iterate over each key value pair
$stringReplacements.Keys | ForEach-Object{
    # Attempt the replacement for each key/pair search/replace pair
    $fileContent =$fileContent.Replace($_,$stringReplacements[$_])
}
# Write changes back to file.
# $fileContent | Set-Content $path

$stringReplacements 是搜索和替换字符串的键值散列。我没有看到您将更改写回文件,所以我在末尾留了一行供您取消注释。

如果您重视 write-host 行,您仍然可以添加检查以进行替换,但我认为那是为了调试,您已经知道如何做到这一点。