programing

PowerShell Out-File 명령에서 줄 바꿈 방지

telecom 2023. 11. 1. 22:08
반응형

PowerShell Out-File 명령에서 줄 바꿈 방지

PowerShell의 Out-File 명령이 출력되는 텍스트 뒤에 새 줄을 추가하지 못하게 하려면 어떻게 해야 합니까?

예를 들어, 다음 명령을 실행하면 "TestTest"가 아닌 "TestTestTest\r\n" 내용의 파일이 생성됩니다.

"TestTest" | Out-File -encoding ascii test.txt

PowerShell 5.0+에서는 다음과 같은 기능을 사용합니다.

"TestTest" | Out-File -encoding ascii test.txt -NoNewline

하지만 이전 버전에서는 그 cmdlet을 사용할 수 없습니다.

시도해 보기:

[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)

뇌물수수자 도움이 되는 답변을 보완하기 위해 다시-NoNewline:

다음은 단지 다음에 적용되는 것이 아닙니다.Out-File, 하지만 마찬가지로Set-Content/Add-Content뿐만 아니라, 진술한 바와 같이,-NoNewlinePSv5+가 필요합니다.

이는 출력객체여러 개일 경우 후행 새 선(줄 바꿈)만 억제되는 것이 아니라 새 선만 억제된다는 것을 의미합니다.

즉,입력 개체의 문자열 표현은 구분자(터미네이터) 없이 직접 연결됩니다.

따라서 다음 명령어는 동일한 파일 내용을 생성합니다 (TestTest후행 줄 없음):

# Single input string
"TestTest" | Out-File -encoding ascii test.txt -NoNewline

# Equivalent command: 2-element array of strings that are directly concatenated.
"Test", "Test" | Out-File -encoding ascii test.txt -NoNewline

출력 개체 에 새 을 배치하지 않고 두 줄 사이에만 새 선을 배치하려면 개체를 새 선과 명시적으로 결합해야 합니다.

"Test", "Test" -join [Environment]::NewLine |
  Out-File -encoding ascii test.txt -NoNewline

[Environment]::NewLine는 플랫폼에 적합한 새로운 라인 시퀀스(Windows의 경우 CRLF, 유닉스 계열 플랫폼의 경우 LF)입니다. 필요한 경우 다음과 같이 명시적으로 둘 중 하나의 시퀀스를 생성할 수도 있습니다."`r`n"그리고."`n"

주의 사항:

위에-join솔루션은 입력 개체가 아직 입력되지 않은 경우 암묵적으로 문자열로 변환합니다. 만약 .NET을 호출하여 이를 수행합니다..ToString()각 개체에 대한 메서드입니다.이것은 종종 다른 표현을 산출합니다.Out-File직접적으로 창조할 것입니다. 왜냐하면Out-FilePowerShell의 기본 출력 형식을 사용합니다. 예를 들어, 출력을 비교합니다.(Get-Date).ToString()그리고 그냥Get-Date.

입력이 표현이 만족스러운 문자열 및/또는 문자열이 아닌 경우에는 위의 솔루션이 효과적이지만, 일반적으로 동일한 문자열을 암시적으로 적용하는 cmdlet을 사용하는 것이 좋습니다.
다음과 같은 차이점에 대한 완전한 논의를 위해Out-File그리고.Set-Content, 이 대답을 보십시오.

입력에 콘솔에 인쇄할 때처럼 형식을 지정하려는 문자열이 없는 경우 간단한 해결책은 없습니다.Out-String기본 형식을 사용하여 개체별 문자열 표현을 만들려면Out-String의 부족.-NoNewline(v5.1 기준으로, 이 GitHub 문제는 이를 도입할 것을 제안합니다.) 항상 새로운 줄이 뒤따를 것입니다.

Briantist와 mklement0의 도움이 되는 답변을 보완하려면 re-NoNewline:

이전 버전의 파워셸에서 Out-File-NoNewLine 매개변수를 대체하기 위해 이 작은 함수를 만들었습니다.

참고: 제 경우에는 7줄(Days of the week)의 .csv 파일용이었습니다.

## Receive the value we want to add and "yes" or "no" depending on whether we want to 
put the value on a new line or not.
function AddValueToLogFile ($value, $NewLine) {
    ## If the log file exists:
    if (Test-path $Config.LogPath) {
        ## And we don't want to add a new line, the value is concatenated at the end.
        if ($NewLine -eq "no") {
            $file = Get-Content -Path $Config.LogPath 
            ## If the file has more than one line
            if ($file -is [array]) {
                $file[-1]+= ";" + $value
            }
            ## if the file only has one line
            else {
                $file +=  ";" + $value
            }
            $file | Out-File -FilePath $Config.LogPath
        }
        ## If we want to insert a new line the append parameter is used.
        elseif ($NewLine -eq "yes") {
            $value | Out-File -Append -FilePath $Config.LogPath
        }
    }
    ## If the log file does not exist it is passed as a value
    elseif (!(Test-path $Config.LogPath)) {
        $value | Out-File -FilePath $Config.LogPath
    }
}

언급URL : https://stackoverflow.com/questions/35279848/prevent-trailing-newline-in-powershell-out-file-command

반응형