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