windows - Udskiftning af flere linjer i en fil

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at lave linjen fra det første array læses fra en fil og erstattes med en linje fra den anden matrix, så nogle gange med forskellige linjer. Jeg lavede et script, men jeg forstår ikke, hvorfor det ikke virker.


$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:	empMy CopyDefault.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
            }
        }
    }
}


Filen er sandsynligvis, hvorfor den ikke læses overhovedet.


Efter at have udført scriptet ser jeg kun


line 2 takes on value: desktopwidth:i:1734 

line 3 takes on value: desktopwidth:i:1734 

line 5 takes on value: desktopwidth:i:1734

Bedste reference


Du kigger gennem snorraceringerne to gange. Du vil gøre to sløjfer, en for hver linje i filen og en anden for hver tælle i de linjer, du erstatter. Jeg synes, det burde fungere:


$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:	empMy CopyDefault.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:	empMy CopyDefault.rdp'

Andre referencer 1


Du behøver ikke at bryde linjerne for at kigge efter kampe. Da du har udskiftningerne klar, skal du bare gøre udskiftningerne alligevel. Bør også hurtigere på denne måde.


$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:	empMy CopyDefault.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 er en nøgleværdi hash for søgning og erstatte strenge. Jeg ser dig ikke at skrive ændringerne tilbage til filen, så jeg forlod en linje på slutningen for at du ikke kunne kommentere.


Du kan tilføje i checks for at gøre udskiftningerne stadig, hvis du værdiansætter write-host linjerne, men jeg regnede med, at det var til debugging, og du ved allerede, hvordan du gør det.