programing

Set-Content가 내 파일 끝에 새 줄(줄 바꿈, CRLF)을 추가합니다.

codeshow 2023. 8. 26. 00:07
반응형

Set-Content가 내 파일 끝에 새 줄(줄 바꿈, CRLF)을 추가합니다.

원래 구성 파일(web1.config)에는 추가 줄이 없으며 메모장에서 볼 때(모든 문자 표시) 다음과 같습니다.

enter image description here

 <?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" />
  </system.web>
  <appSettings>
    <add key="myConnectionString" value="server=localhost;database=myDb;uid=myUser;password=myPass;" />
  </appSettings>
</configuration>

이제 데이터베이스 이름을 다음과 같은 다른 이름으로 변경하는 스크립트를 적용해야 합니다.

 Move-Item "web1.config" "webtemp.config"
Get-Content "webtemp.config" | ForEach-Object {$_ -replace "database=myDb;", "database=newDb;"} |Set-Content "web1.config" -Force
Remove-Item "webtemp.config"
Write-Output('Settings Changed')

따라서 생성된 새 파일(web1.config)은 다음과 같습니다.

enter image description here

파일 끝에 추가된 줄에 주목하세요. (이것은 완전히 필요하지 않습니다) 저는 - out-file api 사용 - .net IO 메서드 시스템 사용과 같은 다른 모든 옵션을 시도했습니다.IO.StreamWriter - newline 플래그 사용(-nonnewline flag 사용) - 다른 인코딩 옵션 사용 - \r\n을 \r로 교체하려고 시도했습니다(set-content가 항상 crlf를 생성하므로 작동하지 않음).

PowerShell v5.1을 사용하고 있습니다.

tl;dr(PSv5+; 이전 버전은 아래 참조):

(Get-Content webtemp.config) -replace 'database=myDb;', 'database=newDb;' -join "`n" |
  Set-Content -NoNewline -Force web1.config

참고: 교체"`n" 와 함께"`r`n" Unix 스타일의 LF 전용 줄 바꿈(PowerShell 및 많은 유틸리티가 둘 다 처리할 수 있음)이 아닌 Windows 스타일의 CRLF 줄 바꿈을 원하는 경우.


PSv5+에서는Set-Content스위치를 지원합니다. 이 스위치는 각 입력 개체 뒤에 새 줄(줄 바꿈)을 추가하지 않도록 지시합니다.동일한 사항이 시스템에 유사하게 적용됩니다.Add-Content그리고.Out-Filecmdlets.

즉, 모든 입력 객체의 문자열 표현직접 연결합니다.

PS> 'one', 'two' | Set-Content -NoNewline tmp.txt; Get-Content tmp.txt
onetwo

당신이 전달하는 것이Set-Content -NoNewline이미줄이 포함된 단일 문자열이므로 그대로 사용하여 원하는 결과를 얻을 수 있습니다.

PS> "one`ntwo" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

참고:Get-Content -Raw파일 전체를 있는 그대로 읽습니다(문자 디코딩에서 추출됨). 그리고 다음과 같은 사실.?바로 뒤에 나타남two파일에 뒤에 줄이 없음을 의미합니다.

경우 입력 라인을 하나씩 처리하고(없이 통해) 라인 배열(문자열) 출력하므로, 먼저 라인을 구분 기호(라인 간에만)로 결합하고 결과를 다음으로 전달해야 합니다.Set-Content -NoNewline상단에 표시된 것처럼, 다음은 단순화된 예입니다.

PS> ('one', 'two') -join "`n" | Set-Content -NoNewline tmp.txt; "$(Get-Content -Raw tmp.txt)?"
one
two?

'one', 'two'는 라인별 처리 명령을 대신하는 2차원 문자열 배열입니다.

인코딩 참고:

윈도우즈 PowerShell에서Set-Content에서는 기본적으로 시스템의 레거시 단일 바이트 코드 페이지를 기반으로 "ANSI" 인코딩 파일을 생성합니다.
명시적으로 는 인딩을명제면려하어로를 합니다.-Encoding 명령어


PSv4-에서는 를 사용하는 솔루션입니다.NET Framework가 필요합니다.

PS> [System.IO.File]::WriteAllText('tmp.txt', ('one', 'two') -join "`n"); "$(Get-Content -Raw tmp.txt)?"
one
two?

인코딩 인수가 없는 경우 기본값은 BOM-less UTF-8입니다.
필요에 따라 원하는 인코딩 인스턴스를 세 번째 인수로 전달합니다.

저는 이 사실을 전혀 몰랐기 때문에 빠른 검색을 통해 다음을 발견했습니다.

set-content는 기본적으로 새 줄을 추가합니다.

내용을 바이트로 인코딩한 다음 -Encoding 매개 변수로 Set-Content를 사용하는 것이 좋습니다.

Set-Content test.txt ([byte[]][char[]] "test") -Encoding Byte

이것이 작동하는지 확인할 수 있도록 제가 직접 테스트했습니다.

xml 파일이군요.이 방법은 새 줄을 추가하지 않습니다.

[xml]$xml = get-content web1.config
$xml.configuration.appSettings.add.value = 
  $xml.configuration.appSettings.add.value -replace 'database=myDb;',
  'database=newDb;'
$xml.save("$pwd\web1.config")  # in case of .net weirdness

언급URL : https://stackoverflow.com/questions/45266461/set-content-appends-a-newline-line-break-crlf-at-the-end-of-my-file

반응형