Board logo

标题: [文本处理] 批处理for语句内如何对变量值进行字符串替换? [打印本页]

作者: hehening88    时间: 2012-6-27 22:53     标题: 批处理for语句内如何对变量值进行字符串替换?

本帖最后由 pcl_test 于 2016-9-13 20:44 编辑

小女在写替换脚本程序时遇到如下问题,哪位前辈知道一下:

原字符串:sd"hello"vc
替换后的字符串:sd"world"vc
功能:检测出原字符串中双引号中的hello,再用world将其替换,最后的输出为sd"world"vc
自己写的脚本如下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f tokens^=1-2*delims^=^" %%i in ("sd"hello"vc") do echo %%j
  4. set str=sd"hello"vc
  5. set substr=%%j
  6. set replace=world
  7. echo %substr%
  8. set "str=!str:%substr%=%replace%!"
  9. echo %str%
  10. pause
复制代码
遇到问题是在脚本第三行最后的%%j带出了hello,完了赋给substr,但是输出echo %substr%是却不是

hello而是%j,因此在替换这行:set "str=!str:%substr%=%replace%!",substr无效,请教一下怎么解

决啊
作者: CrLf    时间: 2012-6-27 23:30

批处理的特色之一是:
%0~%9、%*、%str% 这类参数和变量最先被解释
然后进行语法解析,划分语句
若有开启变量延迟,再对 !str! 这类变量进行解释,一般认为“预处理”在这一步之前或之后结束
将参数交给当前执行的命令自行解读

%substr% 在复合语句中未起到“延迟”解释的效果,所以出错。
复合语句中的变量嵌套参考此贴内容:
http://bbs.bathome.net/viewthread.php?tid=4831
作者: hehening88    时间: 2012-6-28 18:34

回复 2# CrLf


    我刚接触脚本,对解析规则不是很懂,您的连接也看了,不太理解。因为是打包一个程序,临时用到一点脚本,没有全面学习。请问这个问题怎么改正才好呢?
作者: weichenxiehou    时间: 2012-6-28 18:59

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f tokens^=1-2*delims^=^" %%i in ("sd"hello"vc") do echo %%j
  4. ::到此for语句已结束,%%j失效
  5. set str=sd"hello"vc
  6. ::所以下面的%%j应改为“hello"
  7. set substr=%%j
  8. set replace=world
  9. echo %substr%
  10. set "str=!str:%substr%=%replace%!"
  11. echo %str%
  12. pause
复制代码
新手连版主挖掘的for怪异**都用上了,值得欣慰啊。。。
作者: hehening88    时间: 2012-6-28 19:44

回复 4# weichenxiehou


    先谢谢你的关注,版主开发的双引号当分隔符太强大了,不然还真不知道我只能靠双引号分割的问题怎么决解。
   您提醒for语句在echo %%j之后就结束,但是我确实需要用通过for语句提取双引号中的字符串,而且让%%j再后几句都有效
@echo off
setlocal enabledelayedexpansion
for /f tokens^=1-2*delims^=^" %%i in ("sd"hello"vc") do
(
echo %%j
set str=sd"hello"vc
set substr=%%j
echo %substr%
set replace=world
set "str=!str:%substr%=%replace%!"
echo !str!
)
pause
我加上括号之后发现屏幕一闪就消失了,我怎么才能让echo %%j中%%j的值传递给
set substr=%%j和set "str=!str:%substr%=%replace%!"这两句使用呢,紧急求教呀,师兄又再催了
作者: apang    时间: 2012-6-28 20:04

回复 5# hehening88
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=sd"hello"vc
  4. for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
  5.   set substr=%%j
  6.   set replace=world
  7.   echo !substr!
  8.   call set "str=%%str:!substr!=!replace!%%"
  9.   echo !str!
  10. )
  11. pause
复制代码

作者: CrLf    时间: 2012-6-28 20:08

2 楼链接里,随风不是有提到复合语句中的变量嵌套吗?
比较高效且通用的方法是 for 嵌套:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=sd"hello"vc
  4. for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
  5.   set substr=%%j
  6.   set replace=world
  7.   echo !substr!
  8.   for /f "delims=" %%b in ("!substr!=!replace!") do set "str=!str:%%b!"
  9.   echo !str!
  10. )
  11. pause
复制代码

作者: hehening88    时间: 2012-6-28 22:38

回复 6# apang


    非常感谢,我好好看看call语句
作者: hehening88    时间: 2012-6-28 22:40

回复 7# CrLf


    嗯,谢谢你这么耐心,我好好研究一下for /f "delims=" %%b in ("!substr!=!replace!") do set "str=!str:%%b!"这句




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