문제

누구나 디렉토리를 통해 재구성하고 유닉스 파일을 Windows 파일로 변환 할 수있는 Windows의 방법 (PowerShell 또는 도구)을 알고 있습니까?

나는 PowerShell에서 최소한 Unix 파일을 감지하는 방법에 완벽하게 만족할 것입니다.

하나의 단일 파일에 대해서는 쉽게 수행 할 수 있지만 좀 더 확장 가능한 무언가를 쫓고 있습니다 (따라서 PowerShellish 솔루션에 기대어 있습니다).

도움이 되었습니까?

해결책

관심이 있다면 순수한 PowerShell 방법이 있습니다.

적어도 하나의 유닉스 라인 엔딩 (PowerShell v1)이있는 파일 찾기 :

dir * -inc *.txt | %{ if (gc $_.FullName -delim "`0" | Select-String "[^`r]`n") {$_} }

Windows 라인 엔딩에 대한 Unix 라인 엔딩을 찾는 방법은 다음과 같습니다. 주목해야 할 한 가지 중요한 사항은 끝에 이미 끝나는 줄이없는 경우 추가 라인 엔딩 ( r n)이 파일 끝에 추가 될 것입니다. 당신이 정말로 그것을 원하지 않는다면, 나는 당신이 그것을 피할 수있는 방법의 예를 게시 할 것입니다 (조금 더 복잡합니다).

Get-ChildItem * -Include *.txt | ForEach-Object {
    ## If contains UNIX line endings, replace with Windows line endings
    if (Get-Content $_.FullName -Delimiter "`0" | Select-String "[^`r]`n")
    {
        $content = Get-Content $_.FullName
        $content | Set-Content $_.FullName
    }
}

PowerShell은 n에서 내용을 자동으로 분할 한 다음 (존재하는 경우 r을 떨어 뜨린다) 각각 (이 경우 라인)을 파일에 쓸 때 r n을 추가하기 때문에 위의 작업이 작동합니다. 그렇기 때문에 항상 파일 끝에서 끝나는 줄로 끝납니다.

또한 위의 코드를 작성하여 필요한 파일 만 수정합니다. 신경 쓰지 않으면 if 문을 제거 할 수 있습니다. 아, 파일 만 Foreach-Object에 도달하는지 확인하십시오. 그 외에는 해당 파이프 라인의 시작시 원하는 필터링을 수행 할 수 있습니다.

다른 팁

dos2unix와 unix2dos가 있습니다 Cygwin.

이것은 나를 위해 효과가있는 것 같습니다.

Get-Content Unix.txt | Out-File Dos.txt

다운로드 정력, 파일을 열고 발행하십시오

:se fileformat=dos|up

여러 파일의 배치 (C : TMP의 모든 *.txt 파일) :

:args C:\tmp\**\*.txt
:argdo se fileformat=dos|up

Visual Studio를 사용할 수 있습니다. 파일 -> 고급 저장 옵션 ...

Cygwin이 당신을위한 것이 아니라면, Google 주위에 Windows 아래에 UNIX2DOS에 대한 수많은 독립형 실행 파일이 있거나 직접 쓸 수 있습니다. 내 비슷한 (변환의 반대 방향) 질문을 참조하십시오. 여기.

나는 어제 6 시간을 보냈고 오늘은 10,000 파일의 루프로 위에 주어진 코드를 테스트하는 데 많은 크기가> 50kb입니다. 결론적으로, PowerShell 코드는 큰 파일과 많은 파일에 대해 매우 비효율적이고 느리거나 사용할 수 없습니다. 또한 BOM 바이트를 보존하지 않습니다. Unix2DOS 7.2.3이 가장 빠르고 가장 실용적인 솔루션이라는 것을 알았습니다. 이것이 다른 사람들을 돕고 시간을 절약하기를 바랍니다.

WordPad에서 Unix Line Endings가있는 파일을 열고 저장하면 모든 라인 엔딩을 DOS로 다시 작성합니다. 많은 수의 파일에 대해서는 약간 힘이 있지만 가끔씩 몇 개의 파일에 충분히 잘 작동합니다.

그것은 나를 위해 작동합니다 :

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }

이건 어때 (부정적인 외관으로). -nonewline이 없으면 Set -Content는 추가`r`n을 바닥에 넣습니다. 괄호를 사용하면 동일한 파일을 수정할 수 있습니다.

function unix2dos {
    (Get-Content -raw $args[0]) -replace "(?<!`r)`n","`r`n" | 
    set-content -nonewline $args[0]
}

그 반대는 이것, Windows to Unix 텍스트입니다.

function dos2unix {
    (Get-Content -raw $args[0]) -replace "`r`n","`n" | 
    set-content -nonewline $args[0]
}

예 :

unix2dos file.txt
dos2unix file.txt

EMAC가있는 경우 ESC-X HEXL 모드로 확인할 수 있습니다. 메모장은 Unix 텍스트를 올바르게 표시하지 않습니다. PSPATH를 지우기 때문에 설정 경로를 지정해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top