标题: [文本处理] 批处理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
自己写的脚本如下- @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
- set replace=world
- echo %substr%
- set "str=!str:%substr%=%replace%!"
- echo %str%
- 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
- @echo off
- setlocal enabledelayedexpansion
- for /f tokens^=1-2*delims^=^" %%i in ("sd"hello"vc") do echo %%j
- ::到此for语句已结束,%%j失效
- set str=sd"hello"vc
- ::所以下面的%%j应改为“hello"
- set substr=%%j
- set replace=world
- echo %substr%
- set "str=!str:%substr%=%replace%!"
- echo %str%
- 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 - @echo off
- setlocal enabledelayedexpansion
- set str=sd"hello"vc
- for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
- set substr=%%j
- set replace=world
- echo !substr!
- call set "str=%%str:!substr!=!replace!%%"
- echo !str!
- )
- pause
复制代码
作者: CrLf 时间: 2012-6-28 20:08
2 楼链接里,随风不是有提到复合语句中的变量嵌套吗?
比较高效且通用的方法是 for 嵌套:- @echo off
- setlocal enabledelayedexpansion
- set str=sd"hello"vc
- for /f tokens^=1-2*delims^=^" %%i in ("%str%") do (
- set substr=%%j
- set replace=world
- echo !substr!
- for /f "delims=" %%b in ("!substr!=!replace!") do set "str=!str:%%b!"
- echo !str!
- )
- 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 |