Файлы формата UNIX с помощью Powershell - PullRequest
7 голосов
/ 24 февраля 2011

Как создать формат файла Unix в Powershell? Я использую следующее для создания файла, но он всегда создает его в формате Windows.

"hello world" | out-file -filepath test.txt -append

Как я понимаю, символы новой строки CRLF делают его файлом формата Windows, тогда как формат unix требует только LF в конце строки. Я попытался заменить CRLF следующим, но это не сработало

"hello world" | %{ $_.Replace("`r`n","`n") } | out-file -filepath test.txt -append

Ответы [ 3 ]

10 голосов
/ 24 февраля 2011

Командлет в Расширения сообщества PowerShell называется ConvertTo-UnixLineEnding

6 голосов
/ 24 февраля 2011

Один уродливый ответ (принимая входные данные из вывода dos.txt в unix.txt):

[string]::Join( "`n", (gc dos.txt)) | sc unix.txt

но мне бы очень хотелось, чтобы Set-Content делал это сам по себе, и это решение не транслируется и, следовательно, не работает с большими файлами ...

И это решение завершит файл строкой DOS, заканчивающейся также ... так что это не 100%

2 голосов
/ 29 января 2014

Я нашел это решение:

sc unix.txt ([byte[]][char[]] "$contenttext") -Encoding Byte

опубликовано выше, в некоторых случаях происходит сбой при преобразовании кодировки.

Итак, вот еще одно решение (немного более подробное, но оно работает напрямую с байтами):

function ConvertTo-LinuxLineEndings($path) {
    $oldBytes = [io.file]::ReadAllBytes($path)
    if (!$oldBytes.Length) {
        return;
    }
    [byte[]]$newBytes = @()
    [byte[]]::Resize([ref]$newBytes, $oldBytes.Length)
    $newLength = 0
    for ($i = 0; $i -lt $oldBytes.Length - 1; $i++) {
        if (($oldBytes[$i] -eq [byte][char]"`r") -and ($oldBytes[$i + 1] -eq [byte][char]"`n")) {
            continue;
        }
        $newBytes[$newLength++] = $oldBytes[$i]
    }
    $newBytes[$newLength++] = $oldBytes[$oldBytes.Length - 1]
    [byte[]]::Resize([ref]$newBytes, $newLength)
    [io.file]::WriteAllBytes($path, $newBytes)
}
...