Powershell v2:用 LF 替换 CRLF

Powershell v2: Replace CRLF with LF

使用从批处理文件调用的 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.

我怎样才能让它工作?

几件事:

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

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

编辑:

你原来的 post 对我有用,所以看起来这与 PowerShell 5 v 2 有关,我无法测试该解决方案。下面是使用脚本块的解决方案,而不是转义字符:

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

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

我之前说的对你应该用"`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 class):

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 上进行了测试。