【问题标题】:Powershell v2: Replace CRLF with LFPowershell v2:用 LF 替换 CRLF
【发布时间】:2017-06-19 09:33:30
【问题描述】:

使用从批处理文件调用的 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 batch-file windows-7 newline powershell-2.0


    【解决方案1】:

    我之前的人是对的,你应该使用"`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 上进行了测试。

    【讨论】:

    • 谢谢!很棒的信息!为什么要添加前导和号,将命令括在大括号中,并添加终止分号?
    • Hmmm.... 我收到以下错误:您必须在“-join”运算符的右侧提供值表达式
    • 很抱歉。我用 ` 转义了双引号,但是从批处理文件执行时 powershell.exe 需要一个 \ 。我现在已经正确测试了所有示例。
    【解决方案2】:

    有几点:

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

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

    编辑

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

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

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

    【讨论】:

    • 我尝试这个时出了点问题。我收到错误您必须在“-join”运算符的右侧提供值表达式。您能否提供我可以剪切和粘贴的代码行以查看我做错了什么?还要记住,它必须与 Powershell v2 一起使用。
    • 感谢您的更新! :) 当我尝试它时,我将右花括号附加到输出文件名。
    • @RockPaperLizard Np!尝试将file2.txt 替换为"file2.txt",或者将> 替换为内置的| Out-File
    • 双引号括起来不起作用(仍然得到花括号)。将尝试Out-File
    • 到目前为止,Out-File 无法正常工作,因为 Windows 命令处理器(而不是 powershell)正在解释管道符号。
    猜你喜欢
    • 2013-10-08
    • 2022-10-24
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2021-08-07
    • 2011-09-23
    相关资源
    最近更新 更多