【发布时间】:2017-05-09 11:38:14
【问题描述】:
抱歉,第 (n+1) 次打扰您使用批处理脚本进行搜索和替换。 我有文本文件(实际上是 PS 文件)(大约 10kB-3MB),我只需要替换几个数字。
这应该很容易,我想。 我在 Stackoverflow 上发现了很多脚本,但到目前为止它们都没有正常工作。如果我忽略了“工作中的人”,请告诉我。
我尝试的最后一个:
@echo off
setlocal DisableDelayedExpansion
set OutputFile=%1
set OutputFile=%OutputFile:"=%
set InputFile=%OutputFile%.tmp
set SearchString=636170656C6C6133
set ReplaceString=636170656C6C6134
rem write empty file
type NUL > %OutputFile%
for /f "tokens=1,* delims=¶" %%A in ( '"type %InputFile%"') do (
SET string=%%A
setlocal EnableDelayedExpansion
SET modified=!string:%SearchString%=%ReplaceString%!
echo !modified!>>%OutputFile%
endlocal
)
del %InputFile%
首先,它似乎很慢(!)。我可以在磁盘上看到文件大小如何增加。 数字的出现似乎被替换了。但是,文件被更改了,我很容易从不同的文件大小中看出这一点。据我所知,空行、感叹号和以分号开头的行被跳过。这完全弄乱了我的文件。 如何避免这种情况? 如果我用 Perl 做同样的事情,我真的只改变了数字,没有别的。但是,我不想也不能使用 Perl。我也不想使用其他额外的程序或 Windows-Powershell,因为它也应该在旧系统上工作。 有没有办法用一个简单的 Windows 批处理脚本来实现这一点? 谢谢!
【问题讨论】:
-
您遇到的问题是批处理解决方案所固有的。它们可能会被适合您的输入文件的解决方案克服,但您没有对此进行扩展。我认为批处理中的 j-/vbscript 可以帮助您。见jrepl.bat from dbenham on dostips.com
-
感谢@LotPings,所以我知道使用简单的批处理脚本是不可能的,对吗?也许可以通过首先更改文件来完成,即屏蔽
'!'和';'或添加例如'#'在每一行的开头,然后再减去它?如果可能的话,我想避免使用 javascript、vbs-script 等。 -
可以通过使用 find/findstring 对行进行编号来克服空行,
!使用 sub 或伪调用而不是 setlocal enabledelayedexpansion;定义不同的 eol char 但是这一切都不会加快执行速度。 -
您是否尝试使用以下代码集从文件名中去除环绕引号:
set OutputFile=%OutputFile:"=%。你就这样吧。set OutputFile=%~1 -
@Squashman,基本上是的。如果有更优雅的方式,他们是受欢迎的。又学到东西了。谢谢!
标签: windows batch-file search replace