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

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

[复制链接]
发表于 2012-6-27 22:53:41 | 显示全部楼层 |阅读模式
本帖最后由 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无效,请教一下怎么解

决啊
发表于 2012-6-27 23:30:05 | 显示全部楼层
批处理的特色之一是:
%0~%9、%*、%str% 这类参数和变量最先被解释
然后进行语法解析,划分语句
若有开启变量延迟,再对 !str! 这类变量进行解释,一般认为“预处理”在这一步之前或之后结束
将参数交给当前执行的命令自行解读

%substr% 在复合语句中未起到“延迟”解释的效果,所以出错。
复合语句中的变量嵌套参考此贴内容:
http://bbs.bathome.net/viewthread.php?tid=4831
 楼主| 发表于 2012-6-28 18:34:40 | 显示全部楼层
回复 2# CrLf


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

  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怪异**都用上了,值得欣慰啊。。。
 楼主| 发表于 2012-6-28 19:44:48 | 显示全部楼层
回复 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%!"这两句使用呢,紧急求教呀,师兄又再催了
发表于 2012-6-28 20:04:37 | 显示全部楼层
回复 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
复制代码
发表于 2012-6-28 20:08:59 | 显示全部楼层
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
复制代码
 楼主| 发表于 2012-6-28 22:38:02 | 显示全部楼层
回复 6# apang


    非常感谢,我好好看看call语句
 楼主| 发表于 2012-6-28 22:40:26 | 显示全部楼层
回复 7# CrLf


    嗯,谢谢你这么耐心,我好好研究一下for /f "delims=" %%b in ("!substr!=!replace!") do set "str=!str:%%b!"这句
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 03:26 , Processed in 0.017963 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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