【发布时间】:2017-06-23 10:38:08
【问题描述】:
我正在使用 .baat 将多个文件移动到另一个文件夹中,但在实际移动部分之前,我想替换 LAST 行(它是已知行),例如我有一个文件 output.txt 之类的这个:
标题
身体
页脚
使用这个sn-p的代码:
powershell -Command "(gc output.txt) -replace 'FOOTER', 'ONE_MORE_LINE `r`n FOOTER' | Out-File output.txt"
我期望的回报是
标题
身体
ONE_MORE_LINE
页脚
但我得到的是:
标题
身体
ONE_MORE_LINE `r`n FOOTER
我试过了:
\n<br>"`r`n""`n"echo ONE_MORE_LINE >> output.txt; echo. >> output.txt; echo FOOTER >> output.txt"
最后一个接近了,但结果是一些坏字符。
欢迎 PowerShell 之外的其他建议。我之所以使用它,是因为它是一种简单的添加行和替换它的方法。
编辑: 试过这个命令
powershell -Command "(gc output.txt) -replace 'FOOTER;', ""ONE_MORE_LINE `r`n FOOTER"" | Out-File output.txt "
并返回此错误:
A cadeia de caracteres não tem o terminador:“。
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
EDIT2 - 可能的解决方案:
我意识到使用 PowerShell 命令改变了文件的编码,破坏了echo ONE_MORE_LINE,并使用了@AnsgarWiechers 的建议,我编写了这个代码
findstr /v "FOOTER" output.sql > new_output.sql
TYPE new_output.sql > output.sql
del new_output.sql
ECHO. >> %%f
ECHO ONE_MORE_LINE >> %%f
ECHO FOOTER >> %%f
ECHO. >> %%f
它的作用是使用命令findstr /v“FOOTER”我在文件 output.sql 中查找所有不是 FOOTER 的行并将其写入 new_output.sql
然后我TYPE它回到原来的文件,DELnew_output.sql
然后我Echo所有我需要的行就在它下面。
它可以工作,但是对于大文件,我认为重写两次会花费很多时间,但我想不出其他解决方案。
【问题讨论】:
-
PowerShell 不会在单引号字符串中扩展转义序列。您必须在此处使用双引号字符串。将嵌套的双引号加倍以对 CMD 进行转义:
powershell -Command "(...) -replace 'FOOTER', ""ONE_MORE_LINE `r`n FOOTER"" | ..." -
您可以使用
FOR /F命令在纯批处理中执行此操作。您只需将前一行保存在变量中。当读取下一行时,写出上一行。当FOR命令完成后,写出倒数第二行,然后写出将保存在前一个变量中的最后一行。 -
@AnsgarWiechers - 当我将嵌套的双引号加倍时,它返回一个错误,说字符链没有结尾。
-
@Squashman 你能告诉我如何使用纯批处理重写它吗?
-
请使用修改后的命令和确切的错误消息更新您的问题。
标签: powershell batch-file replace windows-10