Powershell - UNIX ANSI文件编码被更改并生成CRLF

时间:2013-01-09 10:18:45

标签: unix powershell encoding newline

我在Windows中使用Powershell在Unix中生成的文件中用'$'替换'£'。问题是输出文件在每行的末尾都有CRLF而不是它最初的LF。当我在Notepad ++中查看原始文件时,状态栏告诉我它是Unix ANSI,我想保留这种格式并在每行的末尾都有LF。 我已经尝试了所有的编码选项没有成功,我也尝试过Set-Content而不是Out-File。我的代码是:

$old = '£'
$new = '$'
$encoding = 'UTF8'
(Get-Content $fileInfo.FullName) | % {$_ -replace $old, $new} | Out-File -filepath $fileInfo.FullName -Encoding $encoding

感谢您的帮助 杰米

2 个答案:

答案 0 :(得分:5)

@Keith Hill为此ConvertTo-UnixLineEnding制作了一个cmdlet,您可以在Powershell Community Extension

中找到它

答案 1 :(得分:1)

我意识到这是一个非常古老的问题,但当我遇到类似的问题时,我偶然发现了它,并认为我会分享对我有用的东西。这可能在将来帮助其他编码人员而无需第三方cmdlet。

当读取Unix格式文件(即LF行终止符,而不是CRLF Windows样式行终止符)时,只需在 Get-中的文件名后使用 -Raw 参数然后输出内容命令,编码类型为 STRING ,但UTF8编码可能具有相同的结果,STRING可以满足我的要求。

我遇到的具体命令是读取模板文件,替换一些变量然后输出到新文件。原始模板是Unix样式,但输出是Windows样式,直到添加-Raw参数,如下所示。请注意,这是我从批处理文件调用的powershell命令,因此它的格式化。

powershell -Command "get-content master.template -Raw | %%{$_ -replace \"@MASTERIP@\",\"%MASTERIP%\"} | %%{$_ -replace \"@SLAVEIP@\",\"%SLAVEIP%\"} | set-content %MYFILENAME%-%MASTERIP%.cfg -Encoding STRING"

我使用Notepad ++检查生成的文件的格式,这在我的情况下起了作用。