使用从批处理文件调用的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
。
我怎样才能让它发挥作用?
答案 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)