Powershell Out-File强制行结束字符

时间:2016-02-09 13:44:07

标签: powershell newline

我发现我可以使用下面的脚本将Unicode文件强制为ASCII,这真的很棒。我假设它基于我的环境或Windows默认值,但它在每行的末尾添加了CR和LF。有没有办法只强制一个LF字符而不是两个而不将整个文件加载到内存中?我已经看到一些解决方案将整个文件加载到内存中并基本上执行字符串替换,这不起作用,因为我的一些文件是多GB。

谢谢!

Update Class 
join Student on Class.StudentID = Student.studentID 
set Class.StudentID = Student.studentID 
where Student.studentID = 1

2 个答案:

答案 0 :(得分:1)

我建议您在脚本中使用.NET System.File.IO类。特别是System.File.IO.StreamWriter类有一个属性NewLine,您可以将其设置为您想要行终止符字符的任何字符。 (虽然StreamReader可以读取行终止符字符,但必须是\n\r\n(因为在反引号上与SO和PS冲突,所以用C / C ++表示法))。

根据此blog使用IO.StreamWriter的第二个好处是更好的性能。

基本代码流是这样的(未经测试):

# Note that IO.StreamWriter will use process's current working directory,
#  not PS's. So safer to specify full paths
$inStream =  [System.IO.StreamReader] "c:\temp\orig.txt"
$outStream = new-object System.IO.StreamWriter "c:\temp\copy.txt",  
                                               [text.encoding]::ASCII
$outStream.NewLine = '`n'
while (-not $inStream.endofstream) {
  $outStream.WriteLine( $instream.Readline())
}
$inStream.close()
$outStream.close()

这个脚本应该有不断的内存要求,但很难知道.NET可能会做什么。

答案 1 :(得分:0)

无法发表评论,显然编辑内容不足,但值得指出

中的字符串文字用法
$outStream.Newline = '`n'

适得其反,因为它通过了

`n

而不是换行符本身$outStream。应该是:

$outStream.Newline = "`n"