Powershell v2:用 LF 替换 CRLF
Powershell v2: Replace CRLF with LF
使用从批处理文件调用的 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 知道您的意思是换行
如果您需要在双引号内转义双引号,请使用 ""
或 `""
编辑:
你原来的 post 对我有用,所以看起来这与 PowerShell 5 v 2 有关,我无法测试该解决方案。下面是使用脚本块的解决方案,而不是转义字符:
powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}
值得注意的是,这在 Notepad++ 中是微不足道的,可以一次对多个文件完成:
我之前说的对你应该用"`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 class):
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 上进行了测试。
使用从批处理文件调用的 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 知道您的意思是换行如果您需要在双引号内转义双引号,请使用
""
或 `""
编辑:
你原来的 post 对我有用,所以看起来这与 PowerShell 5 v 2 有关,我无法测试该解决方案。下面是使用脚本块的解决方案,而不是转义字符:
powershell -Command {(Get-Content file1.txt) -join "`n" > file2.txt}
值得注意的是,这在 Notepad++ 中是微不足道的,可以一次对多个文件完成:
我之前说的对你应该用"`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 class):
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 上进行了测试。