Board logo

标题: [文本处理] 批处理如何替换指定目录及其子目录下所有指定扩展名/类型的文件中的特定字符串 [打印本页]

作者: lee0x7b    时间: 2016-8-9 12:00     标题: 批处理如何替换指定目录及其子目录下所有指定扩展名/类型的文件中的特定字符串

本帖最后由 pcl_test 于 2016-8-9 12:30 编辑

在坛子内搜索过相关帖子,并没有解决疑问...

假设D盘根目录及其子目录下有多个.ini文件,每个ini文件中含有如下内容:
-----------------------------------------------------------------
S:"Local Shell Command Pre-connect V2"=02
S:"Monitor Username"=
S:"Monitor Password V2"=
S:"Username"=1234/root
S:"Password V2"=02
S:"Login Script V3"=
D:"Session Password Saved"=00000001
-----------------------------------------------------------------
现要将其中的S:"Username"=1234/root替换成S:"Username"=root,其他内容保持不变,即最后效果为每个ini文件变成如下内容:

-----------------------------------------------------------------
S:"Local Shell Command Pre-connect V2"=02
S:"Monitor Username"=
S:"Monitor Password V2"=
S:"Username"=root
S:"Password V2"=02
S:"Login Script V3"=
D:"Session Password Saved"=00000001
-----------------------------------------------------------------

下面是我自己写的代码:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. set str=D:\
  4. pushd %str%
  5. for /f "delims=" %%i in ('dir /a-d/s/b *.ini') do (   
  6. for /f "delims=" %%j in (%%i) do (
  7. set a=%%j
  8. set aa=!a:1234/root=root!
  9. echo !aa!>%%i
  10. )
  11. )
  12. pause
复制代码
为什么最后输出到每个ini文件的结果,会变成只剩最后一行D:"Session Password Saved"=00000001

所以代码要怎么改?
作者: pcl_test    时间: 2016-8-9 12:28

没有解决因为你搜索的不够
http://www.bathome.net/thread-2516-1-1.html
作者: lee0x7b    时间: 2016-8-9 12:40

回复 2# pcl_test


    但是如果把>符号改成>>符号追加内容的话,结果只会在原文内容下面重复追加一次原文内容,虽然指定字符串被修改了,但并不是被覆盖。
作者: pcl_test    时间: 2016-8-9 12:43

回复 3# lee0x7b

因为你在边读边写,先将结果输出到临时文件,完了替换掉原文件
作者: lee0x7b    时间: 2016-8-9 12:48

回复 4# pcl_test


    像是这样?
  1. for /f "delims=" %%i in ('dir /a-d/s/b *.ini') do (   
  2. for /f "delims=" %%j in (%%i) do (
  3. set a=%%j
  4. echo !a!
  5. set aa=!a:1234/root=root!
  6. echo !aa!>>tmp.ini
  7. )
  8. del %%i
  9. ren tmp.ini %%i
  10. )
复制代码

作者: pcl_test    时间: 2016-8-9 12:54

回复 5# lee0x7b
echo !a!是什么鬼?文件名有空格怎么办?
还可参考以下替换原文件方式
http://www.bathome.net/redirect. ... 2332&ptid=39409
作者: lee0x7b    时间: 2016-8-9 13:43

回复 6# pcl_test


    echo !a!纯属手误...  但是上面这种方法,还是有问题吧,执行后当前目录下的ini文件被替换成了tmp.ini,子目录下的ini文件全被删除了
作者: lee0x7b    时间: 2016-8-9 14:18

回复 6# pcl_test


        OK我知道怎么改了,是输出到临时文件路径的问题:
  1. @echo off
  2. Setlocal enabledelayedexpansion
  3. set str=D:\
  4. pushd %str%
  5. for /f "delims=" %%i in ('dir /a-d /s /b *.ini') do (   
  6. for /f "usebackq delims=" %%j in ("%%i") do (
  7. set a=%%j
  8. set aa=!a:1234/root=root!
  9. echo !aa!>>"%%~dpi\tmp_%%~nxi"
  10. )
  11. move /y "%%~dpi\tmp_%%~nxi" "%%i"
  12. )
  13. pause
复制代码
这样就可以了

谢版主大大~
作者: pcl_test    时间: 2016-8-9 14:50

本帖最后由 pcl_test 于 2016-8-9 15:02 编辑
  1. @echo off&Setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /a-d/s/b "D:\"*.ini') do (
  3.     for /f "usebackq delims=" %%j in ("%%i") do (
  4.         set "a=%%j"
  5.         >>"%%~dpi临时.文件" echo !a:1234/root=root!
  6.     )
  7.     del "%%i"
  8.     ren "%%~dpi临时.文件" "%%~nxi"
  9. )
  10. pause
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2