通过Powershell或Batch将文件从Windows转换为UNIX

时间:2012-01-13 15:12:41

标签: windows powershell utf-8 batch-file

我有一个批处理脚本,提示用户输入一些输入,然后输出我在AIX环境中使用的几个文件。这些文件需要采用UNIX格式(我认为是UTF8),但我正在寻找SIMPLEST方法的一些方向。

我不想下载额外的软件包; Cygwin或GnuWin32。如果有可能,我不介意编码,我的编码选项是Batch,Powershell和VBS。有谁知道这样做的方法?

或者我可以使用Batch创建文件并调用Powershell脚本来改造这些文件吗?

这里的想法是会提示用户提供一些信息,然后我输出一个标准文件,这些文件基本上是AIX中为作业提示的快速答案。我最初使用Batch,因为我不知道我会遇到这个问题,但我有点倾向于在Powershell中重做这个。因为我在另一个可以进行转换的论坛上找到了一些代码(见下文)。

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

寻找一些方向或一些意见。

2 个答案:

答案 0 :(得分:15)

如果没有批处理文件中的外部工具,则无法执行此操作。

如果您只需要文件编码,那么您提供的代码段应该可以使用。如果你想内联转换文件(而不是把它们写到另一个地方)你可以做

Get-ChildItem *.txt | ForEach-Object { (Get-Content $_) | Out-File -Encoding UTF8 $_ }

Get-Content周围的括号很重要)但是,这将在UTF-8中写入带有签名的文件(U + FEFF),某些Unix工具不接受(尽管从技术角度来说)合法,虽然不鼓励使用)。

然后存在Windows和Unix之间的换行不同的问题。 Unix仅使用U + 000A(LF),而Windows使用两个字符:U + 000D U + 000A(CR + LF)。理想情况下,你也可以转换换行符。但这有点复杂:

Get-ChildItem *.txt | ForEach-Object {
  # get the contents and replace line breaks by U+000A
  $contents = [IO.File]::ReadAllText($_) -replace "`r`n?", "`n"
  # create UTF-8 encoding without signature
  $utf8 = New-Object System.Text.UTF8Encoding $false
  # write the text back
  [IO.File]::WriteAllText($_, $contents, $utf8)
}

答案 1 :(得分:0)

如果您使用的是ANSI字符而不仅仅是ASCII字符,请尝试重载版本ReadAllText(String,Encoding)。

$contents = [IO.File]::ReadAllText($_, [Text.Encoding]::Default) -replace "`r`n", "`n"

https://msdn.microsoft.com/en-us/library/system.io.file.readalltext(v=vs.110).aspx

https://msdn.microsoft.com/en-us/library/system.text.encoding(v=vs.110).aspx
ASCII - 获取ASCII(7位)字符集的编码 默认 - 获取操作系统当前ANSI代码页的编码。