Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Unix换行符到Windows换行符(在Windows上)_Powershell_Newline_Line Breaks - Fatal编程技术网

Powershell Unix换行符到Windows换行符(在Windows上)

Powershell Unix换行符到Windows换行符(在Windows上),powershell,newline,line-breaks,Powershell,Newline,Line Breaks,Windows中是否有一种方法(例如PowerShell或工具)可以在目录上递归并将任何Unix文件转换为Windows文件 我非常乐意在PowerShell中找到一种至少可以检测到Unix文件的方法 对一个文件执行此操作很容易,但我想要的是更具可伸缩性的东西(因此倾向于使用PowerShell解决方案)。中有dos2unix和unix2dos。如果Cygwin不适合您,在Windows下有许多独立的unix2dos可执行文件,如果您四处搜索,或者您可以自己编写一个。请参阅我的类似(转换方向相反

Windows中是否有一种方法(例如PowerShell或工具)可以在目录上递归并将任何Unix文件转换为Windows文件

我非常乐意在PowerShell中找到一种至少可以检测到Unix文件的方法


对一个文件执行此操作很容易,但我想要的是更具可伸缩性的东西(因此倾向于使用PowerShell解决方案)。

中有dos2unix和unix2dos。

如果Cygwin不适合您,在Windows下有许多独立的unix2dos可执行文件,如果您四处搜索,或者您可以自己编写一个。请参阅我的类似(转换方向相反)问题。

下载、打开文件并发布

:se fileformat=dos|up
多个文件的批处理(C:\tmp-递归中的所有*.txt文件):


你可以用。菜单文件→ 高级保存选项…

如果您感兴趣,这里是纯PowerShell方式

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

dir*-inc*.txt |%{if(gc$\.FullName-delim“`0”| Select String”[^`r]`n”){$}
以下是如何查找Unix行结尾并将其转换为Windows行结尾。需要注意的一件重要事情是,如果文件末尾没有行结尾,则会在文件末尾添加一个额外的行结尾(\r\n)。如果你真的不想这样,我将发布一个例子,说明如何避免这种情况(它有点复杂)

Get ChildItem*-包含*.txt | ForEach对象{
##如果包含UNIX行尾,请替换为Windows行尾
if(获取内容$\u.FullName-分隔符“`0”|选择字符串“[^`r]`n”)
{
$content=Get content$\ux.FullName
$content | Set content$|.FullName
}
}
上述操作之所以有效,是因为PowerShell将自动拆分\n上的内容(如果存在,则删除内容),然后在将每个内容(在本例中为一行)写入文件时添加内容。这就是为什么您总是以文件结尾的行结束


另外,我编写了上面的代码,以便它只修改需要修改的文件。如果您不关心这一点,可以删除
If
语句。哦,请确保只有文件才能访问。除此之外,您还可以在管道开始时执行任何筛选操作。

在中打开一个带有Unix行结尾的文件并保存它将把所有行结尾重写为DOS。对于大量的文件来说,这有点费劲,但对于偶尔出现的几个文件来说,这已经足够了。

在一个包含10000个文件的循环中测试前面答案中给出的代码的结果,其中许多文件的大小超过50 KB:


底线是PowerShell代码对于大文件和大量文件来说效率非常低/速度很慢/不可用。它也不保留字节。我发现unix2dos7.2.3是最快、最实用的解决方案。

这似乎对我很有用

Get Content Unix.txt | Out File Dos.txt

转换为Windows文本非常简单:

(获取内容文件)|设置内容文件
使用以下命令(带负向后看)。如果没有
-nonewline
,set content会在底部添加一个额外的'r`n。使用括号,可以修改同一文件。如果意外地对同一个文件执行两次,这应该是安全的

函数unix2dos($infle,$outfile){
(获取内容-原始$infle)-替换“(?它适合我:

 Get-ChildItem -Recurse -File | % { $tmp = Get-Content $_; $tmp | Out-File "$_" -Encoding UTF8 }
在此基础上,我创建了以下脚本:

$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 }

你能为文件夹或批处理作业这样做吗?或者下载Eclipse,打开文件并将行delimeters转换为Unix。vim无疑是一个很棒的工具,我每天都在使用它。但是你不觉得用它转换endofline有点过分了吗?这只是我想到的第一件事,它在我拥有/管理的每个盒子上。顺便问一下:你是ac吗实际上,我建议使用eclipse(85MB)并一个文件一个文件地执行它,而不是使用vim(8.5MB)并一次执行所有操作?我建议使用这种技术,因为unix UTIL可以更好地维护原始文件编码(UTF-8、ASCII等).过去我打算保留ASCII文件ASCII.or msys,然后您可以使用cmd中的实用程序时,我在PS上遇到了问题。我使用powershell列出文件,然后通过管道将其发送到dos2unix.exe,如下所示:
dir-Recurse-File-Exclude.git |%{dos2unix--u2d--skipbin$|
@orad如果您已经在使用unix命令dos2unix,为什么不同时使用unix find?或者下载Win32 binary并直接在
cmd.exe
/PowerShell!默认情况下,PowerShell在“Unicode”中工作"。我不是文本编码方面的专家,但我还没有遇到默认值的问题。如果愿意,可以显式地为Get Content设置编码,并使用-encoding参数设置Content命令。Get Help Get Content-parameterEncoding@PeterSealeSet Content或Out File具有可用于设置文件的-Encoding参数编码类型。可能还需要添加-recurse标志来搜索嵌套文件夹。例如,Get ChildItem-Path.\-recurse | ForEach对象…对于认为由于git repo出错而需要执行此操作的人,您可能不需要这样做。可以用其他方式解决git的此问题,例如:这与Get Content是ver这一事实有关速度慢(效率低),尤其是在较大的文件上。应该将其转换为注释(以获得适当或最接近的匹配答案)-这不能回答问题。或者
Get Content Unix.txt | Set Content Dos.txt
Out文件输出utf-16或“unicode”文本。我建议改为在PS 5中设置内容。当源文件与目标文件相同时,这会给我一个空文件。我必须通过不同的file@Joffrey
(Get Content file.txt)| Set Content file.txt
为什么脚本的第一行有分号?
$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 }