找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26296|回复: 8

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

[复制链接]
发表于 2016-8-9 12:00:17 | 显示全部楼层 |阅读模式
本帖最后由 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

所以代码要怎么改?
发表于 2016-8-9 12:28:10 | 显示全部楼层
没有解决因为你搜索的不够
http://www.bathome.net/thread-2516-1-1.html
 楼主| 发表于 2016-8-9 12:40:42 | 显示全部楼层
回复 2# pcl_test


    但是如果把>符号改成>>符号追加内容的话,结果只会在原文内容下面重复追加一次原文内容,虽然指定字符串被修改了,但并不是被覆盖。
发表于 2016-8-9 12:43:13 | 显示全部楼层
回复 3# lee0x7b

因为你在边读边写,先将结果输出到临时文件,完了替换掉原文件
 楼主| 发表于 2016-8-9 12:48:42 | 显示全部楼层
回复 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. )
复制代码
发表于 2016-8-9 12:54:04 | 显示全部楼层
回复 5# lee0x7b
echo !a!是什么鬼?文件名有空格怎么办?
还可参考以下替换原文件方式
http://www.bathome.net/redirect. ... 2332&ptid=39409
 楼主| 发表于 2016-8-9 13:43:57 | 显示全部楼层
回复 6# pcl_test


    echo !a!纯属手误...  但是上面这种方法,还是有问题吧,执行后当前目录下的ini文件被替换成了tmp.ini,子目录下的ini文件全被删除了
 楼主| 发表于 2016-8-9 14:18:35 | 显示全部楼层
回复 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
复制代码
这样就可以了

谢版主大大~
发表于 2016-8-9 14:50:32 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1技术 +1 收起 理由
lee0x7b + 1 非常感谢!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 14:07 , Processed in 0.021032 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表