2017-11-03 11 views
0

첫 번째 줄의 줄은 파일에서 읽히고 두 번째 줄의 줄로 바뀌므로 다른 줄이 사용됩니다. 나는 대본을 만들었지 만 왜 효과가 없는지 이해하지 못합니다.파일의 여러 줄 바꾸기

$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 
      } 
     } 
    } 
} 

아마도 파일이 전혀 읽히지 않는 이유 일 것입니다.

스크립트를 실행 한 후에, 나는 당신이 두 번 문자열 배열을 통해보고하는 경우에만

 
line 2 takes on value: desktopwidth:i:1734 

line 3 takes on value: desktopwidth:i:1734 

line 5 takes on value: desktopwidth:i:1734 

답변

0

참조하십시오. 파일의 각 줄마다 하나씩, 바꾸는 줄의 각 줄마다 두 개의 루프를 수행하려고합니다. 내 생각에 이것이 작동해야한다고 생각합니다 :

$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' 
+1

배열의 후행 백틱은 필요하지 않습니다. 또한'-replace'가 정규 표현식 연산자임을주의하십시오. – Matt

+0

@Matt 그 사람들이 어떻게 거기에 있는지 모르겠습니다. 나는 그것들을 추가하지 않았을 것이고 나는 원래의 대답에서 내가 하에게서 베낀 것이 아니었다. –

+1

정규식 연산자를 사용하지 않으려면 다음을 사용하십시오. $ LinesArray [$ i] = $ LinesArray [$ i] .Replace ($ OldStrings [$ j], $ NewStrings [$ j]) ' –

0

당신은 성냥을 찾기 위해 선을 검사 할 필요가 없습니다. 대체물을 준비 했으므로 어쨌든 대체물을 바꿔 치기 만하면됩니다. 이 방법도 더 빨라야합니다.

$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 라인을 여전히 가치 있다고 생각하더라도 추가 검사를 추가 할 수는 있지만 디버깅 용으로 알고 있으며 이미 수행 방법을 알고 있습니다.

+0

예를 들어 주셔서 감사합니다. 마지막 줄의 주석 처리를 제거했지만 스크립트가 변경 사항을 작성하지 않습니다. 파일로 돌아 가기 –

+0

하. 그것은 저를위한 신인 선수 실수였습니다. 변경 내용을 파일 내용에 다시 쓰는 것을 잊었습니다. 결과를 std로 작성했을 것입니다. – Matt

+0

이제 괜찮을 것입니다. – Matt