Powershell v2:用LF替换CRLF

时间:2017-06-19 09:33:30

标签: powershell batch-file windows-7 newline powershell-v2.0

使用从批处理文件调用的Powershell v2,我想用一个LF替换文件中的每个CRLF。如果一个文件只有LF没有任何CR,那么我希望所有的LF都保持不变。

如果可能,我不希望在结果文件中终止CRLF。

我发现this question here on Stack Overflow似乎是一个非常接近的匹配,但它没有指定Powershell版本要求,也没有指定上面的其他条件。因此这个问题。

该问题的接受答案建议使用以下代码:

$in = "C:\Users\abc\Desktop\File\abc.txt"
$out = "C:\Users\abc\Desktop\File\abc-out.txt"
(Get-Content $in) -join "`n" > $out

我稍微修改了它,并将其调整为在批处理文件中工作,读取:

powershell -Command "(Get-Content file1.txt) -join '`n' > file2.txt"

不幸的是,这不起作用。所有LF都转换为字符串 `n

我怎样才能让它发挥作用?

2 个答案:

答案 0 :(得分:2)

在我面前的人是对的,你应该使用"`n"

使用PowerShell时,我建议执行以下开关:
-noninteractive表示您不想与powershell进行交互 -NoProfile - 大大提高了速度(跳过加载配置文件)
-ExecutionPolicy Bypass - 如果您处于公司环境中,则绕过安全问题

修改

抱歉你提到的错误。我现在有PowerShell 2.0测试工具。

修复了你的例子(错误是由于powershell.exe解释它们你必须逃避双引号)。这种方法不能完全正常工作,因为它会在文件的末尾留下CRLF

powershell.exe -noninteractive -NoProfile -ExecutionPolicy Bypass -Command "& {(Get-Content file_crlf.txt) -join \"`n\" > file_lfonly.txt};"

但是,完全正确的解决方案需要不同的方法(通过IO.file类):

powershell.exe -noninteractive -NoProfile -ExecutionPolicy Bypass -Command "& {[IO.File]::WriteAllText('file_lfonly.txt', ([IO.File]::ReadAllText('file_crlf.txt') -replace \"`r`n\", \"`n\"))};"

这会将您的CRLF完全转换为LF。只是一小段警告它转换为ASCII而不是Unicode(超出了这个问题的范围)。

现在,所有示例都在PowerShell v2.0.50727上进行了测试。

答案 1 :(得分:0)

有几件事:

  • 单引号'是文字的 - 使用双引号",以便PowerShell知道您的意思是新行

  • 如果您需要在双引号内转义双引号,请使用""或`“

修改

您的原始帖子对我有效,所以看起来这与PowerShell 5 v 2有关,我无法测试解决方案。这是一个使用scriptblock的解决方案,而不是转义字符:

powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}

值得注意的是,这在Notepad ++中是微不足道的,可以同时为多个文件完成:

New line replace in Notepad++