Set-Content가 내 파일 끝에 새 줄(줄 바꿈, CRLF)을 추가합니다.
원래 구성 파일(web1.config)에는 추가 줄이 없으며 메모장에서 볼 때(모든 문자 표시) 다음과 같습니다.
<?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)은 다음과 같습니다.
파일 끝에 추가된 줄에 주목하세요. (이것은 완전히 필요하지 않습니다) 저는 - 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-File
cmdlets.
즉, 모든 입력 객체의 문자열 표현을 직접 연결합니다.
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
'programing' 카테고리의 다른 글
CSS에서 '@' 기호의 목적은 무엇입니까? (0) | 2023.08.26 |
---|---|
express는 'body-parser deprecommended extended'로 오류를 발생시킵니다. (0) | 2023.08.26 |
하위 폴더로 폴더를 복사하는 방법은 무엇입니까? (0) | 2023.08.26 |
Python을 사용하여 미니돔으로 요소 값 가져오기 (0) | 2023.08.26 |
스크립트 태그에서 온로드 이벤트를 실행하려고 합니다. (0) | 2023.08.26 |