Powershell v2:将CRLF替换为LF

Powershell v2:将CRLF替换为LF,powershell,batch-file,windows-7,newline,powershell-2.0,Powershell,Batch File,Windows 7,Newline,Powershell 2.0,使用从批处理文件调用的Powershell v2,我想用一个LF替换文件中的每个CRLF。如果一个文件只有LF而没有任何CR,那么我希望所有LF都保持独立 如果可能,我不希望结果文件中有终止的CRLF 我发现,这似乎非常匹配,但它没有指定Powershell版本要求,也没有指定上述其他标准。所以这个问题 该问题的公认答案建议使用以下代码: $in = "C:\Users\abc\Desktop\File\abc.txt" $out = "C:\Users\abc\Desktop\File\abc

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

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

我发现,这似乎非常匹配,但它没有指定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 v 2有关,我无法测试解决方案。以下是使用scriptblock的解决方案,而不是转义字符:

powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}
值得注意的是,这在Notepad++中非常简单,可以同时对多个文件执行:

有几件事:

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

  • 如果需要在双引号中转义双引号,请使用
    或”

编辑

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

powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}
值得注意的是,这在Notepad++中非常简单,可以同时对多个文件执行:


我前面的那些是对的,你应该使用
“`n”

使用PowerShell时,我建议执行以下开关:
-非交互式
表示您不想与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类):

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


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

我之前的示例是正确的,您应该使用
“`n”

使用PowerShell时,我建议执行以下开关:
-非交互式
表示您不想与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类):

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


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

谢谢!好消息!为什么要添加前导符号和,将命令用大括号括起来,并添加终止分号?嗯。。。。我得到以下错误:您必须在“-join”运算符的右侧提供一个值表达式。请对此进行更正。我用“但是powershell.exe在批处理文件中执行时需要\来转义双引号。我现在已经正确地测试了所有示例。谢谢!好消息!为什么要添加前导符号和,将命令用大括号括起来,并添加终止分号?嗯。。。。我得到以下错误:您必须在“-join”运算符的右侧提供一个值表达式。请对此进行更正。我用“但是powershell.exe在批处理文件中执行时需要\来转义双引号。我现在已经正确地测试了所有的例子。当我尝试这个时,有些地方出了问题。我得到一个错误,您必须在'-join'运算符的右侧提供一个值表达式。你能提供我可以剪切和粘贴的代码行,看看我做错了什么吗?还请记住,它必须与Powershell v2配合使用。感谢您的更新!:)当我尝试它时,我会在输出文件名后附加一个右大括号。@RockPaperLizard Np!尝试将
file2.txt
替换为
“file2.txt”
,或将
替换为内置的
| Out文件
,用双引号括起来的部分不起作用(仍然使用大括号)。将尝试
输出文件
。到目前为止,
输出文件
不工作,因为Windows命令处理器(而不是powershell)正在解释管道符号。尝试此操作时出现问题。我得到一个错误,您必须在'-join'运算符的右侧提供一个值表达式。你能提供我需要的代码行吗