2017-06-19 154 views
0

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

如果可能,我不想在结果文件中终止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

我该如何得到这个工作?

回答

1

那些是正确的,你应该使用"`n"

当使用PowerShell中,我建议执行它下面的开关:
- 非交互式表示你不想与PowerShell的互动
- NOPROFILE - 大大加快东西(跳过加载配置文件)
- ExecutionPolicy绕过 - 绕过安全问题,如果您是在公司环境

编辑:

对不起,你提到的错误。我现在拥有PowerShell 2.0测试工具。

修正了你的例子(错误是你必须通过powershell.exe解释它们来避免双引号)。完全

powershell.exe -noninteractive -NoProfile -ExecutionPolicy Bypass -Command "& {[IO.File]::WriteAllText('file_lfonly.txt', ([IO.File]::ReadAllText('file_crlf.txt') -replace \"`r`n\", \"`n\"))};" 

此:这种做法并不完全,因为它离开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上进行了测试。

+0

谢谢!伟大的信息!为什么要添加前导符号,将该命令放在花括号中,并添加终止分号? – RockPaperLizard

+0

嗯......我得到以下错误:**您必须在'-join'操作符的右侧提供值表达式** – RockPaperLizard

+1

对不起。我用''''''''''''''''''''''''转义了双引号。我现在已经正确地测试了所有示例。 – tukan

0

几件事情:

  • 单引号'是文字 - 用双引号",这样的PowerShell知道你的意思是新线

  • 如果您需要逃避双引号内的双引号,使用""或`”

编辑

您的原始文章适合我,因此看起来像这与PowerShell 5 v 2相关,我无法测试解决方案。取而代之的转义字符,这里是一个解决方案使用脚本块:

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

值得一提的是,这是在记事本琐碎++,可以为多个文件进行一次:我之前

New line replace in Notepad++

+0

我尝试这样做时出现了问题。我得到错误**您必须在'-join'运算符**的右侧提供值表达式。你能提供我可以剪切和粘贴的代码行,看看我做错了什么吗?请记住,它必须适用于Powershell v2。 – RockPaperLizard

+0

感谢您的更新! :)当我尝试它时,我得到了附加的大括号附加到输出文件名。 – RockPaperLizard

+0

@RockPaperLizard Np!尝试使用'“file2.txt”替换'file2.txt',或者使用内置的'|替换'''' Out-File' – gms0ulman

相关问题