Powershell v2: 将CRLF替换为LF
Powershell v2: 将CRLF替换为LF
我想使用批处理文件调用PowerShell v2,将文件中的每个CRLF替换为LF。如果文件中只有LF而没有CR,则希望所有的LF保持不变。如果可能的话,我不希望在结果文件中有终止的CRLF。
我在Stack Overflow上找到了一个与此相近的问题,链接地址为:https://stackoverflow.com/questions/19127741/replace-crlf-using-powershell。但是该问题没有指定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 无法识别换行符。如果需要在双引号内转义双引号,则使用两个双引号或反引号进行转义。另外,该解决方法在 PowerShell 5 v2 中可能无效。
为了解决这个问题,可以使用脚本块来替代转义字符。在 PowerShell 命令中使用以下代码:
powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}
此外,使用 Notepad++ 也可以轻松实现这个目标,并且可以同时处理多个文件。
在尝试解决问题时,有用户反馈出现了错误信息“在 -join 运算符的右侧必须提供一个值表达式”。为了帮助用户定位错误,需要提供一行可以复制粘贴的代码。同时,需要确保代码适用于 PowerShell v2。
感谢用户的反馈更新!如果仍然遇到问题,请尝试将file2.txt
替换为"file2.txt"
,或者使用内置的| Out-File
代替>
。
尝试使用双引号括起来的方式可能无效(仍然会出现花括号)。可以尝试使用Out-File
来解决该问题。然而,该解决方法可能无效,因为 Windows 命令处理器(而不是 PowerShell)会解释管道符号。
Powershell v2: 将CRLF替换为LF的问题出现的原因是因为在执行命令时没有正确转义双引号。解决方法是通过使用IO.file类来进行操作。
在使用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上经过了测试。
感谢您提供的信息!为什么要添加前导的“&”,将命令括在大括号中,并添加终止分号?
哎呀...我收到了以下错误:在'-join'运算符的右侧必须提供值表达式
对此我深感抱歉。我使用了`来转义双引号,但是当从批处理文件中执行powershell.exe时,它需要一个\。我现在已经正确地测试了所有示例。