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

[文本处理] [已解决]批处理如何修改文本中的指定值?

[复制链接]
发表于 2010-4-15 13:55:02 | 显示全部楼层 |阅读模式

我有一个文件build.properties,内容如下
  1. #  $DateTime: 2010/03/26 17:56:36 $ $Change: 93719 $ $Author: xxx $
  2. ##################################################
  3. # DIRECTORY PROPERTIES (that supersede those in build.xml
  4. ##################################################


  5. # should be the absolute path to the current dir
  6. BUILDTOOLS=/change/this/value


  7. # should be the absolute path to the parent of the app build dir
  8. BUILDROOT=/change/this/value


  9. # should be the absolute path to the parent of the app build dir
  10. DIR_NAME=proddev

  11. #eof
复制代码
现在我想去修改其中的某项值,比如将BUILDTOOLS=后的/change/this/value修改成D:\Code\dev\BuildUtil,
BUILDROOT=后的/change/this/value修改成D:\Code\dev,其他原样输出。然后输出为config.ini文件

我看了一些介绍,自己写了一个,如下
  1. @echo off&&setlocal enabledelayedexpansion
  2. set n=0
  3. set DevPath=D:\Code\dev
  4. set FilePath=%DevPath%\BuildUtil
  5. for /f "delims== tokens=1,2" %%i in (build.properties) do (
  6. if !n! equ 0 (>config.ini echo %%i %%j) else (                        
  7.   if %%i equ BUILDTOOLS (>>config.ini echo %%i=%FilePath%) else (                        
  8.   if %%i equ BUILDROOT (>>config.ini echo %%i=%DevPath%) else (>>config.ini echo %%i=%%j)))                        
  9. set/a n+=1
  10. )
复制代码

但是生成的config.ini文件中有一些多余的=(等于号),我就不知道怎么修改了,请帮忙修改下,或者能实现同样的功能。
谢谢了。




[ 本帖最后由 michael_hy 于 2010-4-15 16:28 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢主动给标题标注[已解决]字样

查看全部评分

发表于 2010-4-15 14:29:00 | 显示全部楼层
不含敏感字符、不需要保留空行情况下:
  1. @echo off 2>config.ini
  2. (for /f "tokens=1* delims==" %%i in (build.properties) do if "%%j"=="" (echo.%%i) else (set "k=%%j"
  3. if /i "%%i"=="BUILDTOOLS" set "k=D:\Code\dev\BuildUtil"
  4. if /i "%%i"=="BUILDROOT" set "k=D:\Code\dev"
  5. call echo.%%i=%%k%%))>>config.ini
复制代码

[ 本帖最后由 hanyeguxing 于 2010-4-15 15:00 编辑 ]

评分

参与人数 1PB +5 收起 理由
Batcher + 5 乐于助人

查看全部评分

 楼主| 发表于 2010-4-15 14:40:07 | 显示全部楼层
非常感谢你的回复
就是我还有其他不需要修改的属性,比如DIR_NAME=proddev
并没有一起输出,还有如果第二次运行的话只能追加,不能修改已经存在的文件了
再麻烦瞅瞅,谢谢。
发表于 2010-4-15 14:59:17 | 显示全部楼层
原帖由 michael_hy 于 2010-4-15 14:40 发表
非常感谢你的回复
就是我还有其他不需要修改的属性,比如DIR_NAME=proddev
并没有一起输出,还有如果第二次运行的话只能追加,不能修改已经存在的文件了
再麻烦瞅瞅,谢谢。

你再试试
 楼主| 发表于 2010-4-15 15:46:31 | 显示全部楼层
多谢了,能达到目的了。
请问%%i=%%k%%是什么意思?是相当于!k!的延迟变量么?
还有一个问题,我的那种写法中,如果是一个空行,会输出ECHO is off.到文件中
这个如何去掉呢?
发表于 2010-4-15 15:57:09 | 显示全部楼层
1,call echo.%%i=%%k%%中,由call来执行对%%k%%的延迟扩展的。
顺便说一下,在这样操作时,变量名尽量不要使用for中已经定义了的,例如通过tokens=1* 和 %%i 定义了%%i和%%j,所以set k=,在call中使用了%%k%%,而不能使用如%%i%%或%%j%%,以免call出错来。
2,举个例子:
使用echo %a%
当%a%未被定义即不存在时,则%a%本身在扩展时就被去掉了,而前面的空格也被忽略,所以就剩一个echo了。单独运行echo,就是显示回显的状态。所以你看我的代码里使用的形如echo.%a%,这个点不被忽略,执行echo.就是显示一个空行了。

[ 本帖最后由 hanyeguxing 于 2010-4-15 15:59 编辑 ]

评分

参与人数 1PB +5 收起 理由
Batcher + 5 乐于助人

查看全部评分

 楼主| 发表于 2010-4-15 16:08:28 | 显示全部楼层
哇塞,说的太好了,真是太感谢了~~
真是谢谢你的大力帮忙。~~
 楼主| 发表于 2010-4-15 16:22:11 | 显示全部楼层
我又改了下我原来那个,也能达到效果了
授之以鱼不如授之以渔,再次感谢了。
  1. @echo off&&setlocal enabledelayedexpansion
  2. set n=0
  3. set DevPath=D:\Code\dev
  4. set FilePath=%DevPath%\BuildUtil
  5. for /f "delims== tokens=1*" %%i in (build.properties) do (
  6. if !n! equ 0 (>config.ini echo %%i) else (
  7.         if "%%j"=="" (>>config.ini echo.%%i) else (
  8.           if %%i equ BUILDTOOLS (>>config.ini echo %%i=%FilePath%) else (
  9.           if %%i equ BUILDROOT (>>config.ini echo %%i=%DevPath%) else (>>config.ini echo %%i=%%j))))
  10. set/a n+=1
  11. )
复制代码
发表于 2010-4-15 16:41:50 | 显示全部楼层
这有个类似的帖子,如果修改的key项很多的时候可以采用
http://bbs.bathome.net/viewthrea ... =1#pid48470pid48470
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 00:44 , Processed in 0.019273 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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