Windows换行符的Unix换行符(在Windows上)

时间:2009-04-07 03:57:30

标签: powershell newline line-breaks

有没有人知道Windows中可以递归目录并将任何unix文件转换为Windows文件的方式(比如Powershell或工具)。

我对Powershell中至少检测到unix文件的方式非常满意。

对于单个文件来说这很简单,但是我追求的是一些可扩展的东西(因此倾向于Powershellish解决方案)。

11 个答案:

答案 0 :(得分:33)

如果您有兴趣,这是纯粹的PowerShell方式。

查找至少有一个UNIX行结束的文件(PowerShell v1):

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

以下是查找和修改UNIX行结尾到Windows行结尾的方法。需要注意的一件重要事情是,如果末尾没有行结束,则会在文件末尾添加额外的行结尾(\ 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 \ n),然后在将每个东西(在本例中为一行)写入文件时添加\ r \ n。这就是为什么你总是以文件末尾的一行结束。

另外,我编写了上面的代码,以便它只修改它需要的文件。如果您不关心,可以删除if语句。哦,确保只有文件到达ForEach-Object。除此之外,您可以在该管道的开头做任何您想要的过滤。

答案 1 :(得分:13)

Cygwin中有dos2unix和unix2dos。

答案 2 :(得分:8)

这似乎对我有用。

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

答案 3 :(得分:6)

下载vim,打开您的文件并发出

:se fileformat=dos|up

批处理多个文件(C:\ tmp中的所有* .txt文件 - 递归):

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

答案 4 :(得分:2)

您可以使用Visual Studio。档案 - >高级保存选项...

答案 5 :(得分:1)

如果Cygwin不适合你,那么如果你在谷歌周围有unix2dos的许多独立可执行文件,或者你可以自己编写一个,看看我的相似(转换方向相反)问题here

答案 6 :(得分:1)

我昨天花了6个小时,今天用一万个文件测试上面给出的代码,其中许多文件大小> 50kb。总而言之,对于大型文件和大量文件,powershell代码效率非常低/慢/不可用。它也不保留BOM字节。我发现unix2dos 7.2.3是最快,最实用的解决方案。希望这有助于他人并节省时间。

答案 7 :(得分:0)

在Wordpad中打开带有Unix行结尾的文件并保存它将把所有行结尾重写为DOS。对于大量文件来说有点费力,但它偶尔适用于几个文件。

答案 8 :(得分:0)

怎么样(只做一次):

(Get-Content -raw unix.txt) -replace "`n","`r`n" | set-content windows.txt

答案 9 :(得分:0)

它对我有用:

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

答案 10 :(得分:0)

基于@ js2010回答,我已经创建了此脚本

$excludeFolders = "node_modules|dist|.vs";
$excludeFiles = ".*\.map.*|.*\.zip|.*\.png|.*\.ps1"

Function Dos2Unix {
    [CmdletBinding()]
    Param([Parameter(ValueFromPipeline)] $fileName)

    Write-Host -Nonewline "."

    $fileContents = Get-Content -raw $fileName
    $containsCrLf = $fileContents | %{$_ -match "\r\n"}
    If($containsCrLf -contains $true)
    {
        Write-Host "`r`nCleaing file: $fileName"
        set-content -Nonewline -Encoding utf8 $fileName ($fileContents -replace "`r`n","`n")
    }
}

Get-Childitem -File "." -Recurse |
Where-Object {$_.PSParentPath -notmatch $excludeFolders} |
Where-Object {$_.PSPath -notmatch $excludeFiles} |
foreach { $_.PSPath | Dos2Unix }