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

[文本处理] 【已解决】批处理命令for嵌套中怎样使用变量嵌套?

[复制链接]
发表于 2014-3-2 14:05:47 | 显示全部楼层 |阅读模式
本帖最后由 ge_xin_yu 于 2014-3-4 20:53 编辑

文件sample.xml:
  1.   <gfx-1 id="page" group-id="1" />
复制代码
现在想将sample.xml中的字符“page”替换为随机数,输出2次,代码如下:
  1. @echo off & SETLOCAL EnableDelayedExpansion
  2. for /l %%i in (1,1,2) do (
  3.   set r=!random!
  4.   for /f "delims=" %%j in (sample.xml) do (
  5.     set a=%%j
  6.     set var=!a:page=%r%!
  7.     echo  替换后的值: !var!
  8.   )
  9. )
  10. pause
复制代码
运行,输出如下:
  1. <gfx-1 id="" group-id="1" />
  2. <gfx-1 id="" group-id="1" />
复制代码
没有效果,“page”替换为空,测试发现如果去掉外层的for语句,替换正常。估计和变量延迟有关,于是将set var=!a:page=%r%!改为set var=!a:page=!r!!,运行,却得到了另外的结果,后面多了个“r”,如下:
  1. <gfx-1 id="" group-id="1" />  r
  2. <gfx-1 id="" group-id="1" />  r
复制代码
也是失败,对这个变量延迟仍然比较糊涂,变量中不允许两组感叹号存在吗?如果在复合语句嵌套中需要嵌套变量,该怎么办呢?另外第二次替换后为何多个“r”呢?请教大家,深致谢意!!

评分

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

查看全部评分

发表于 2014-3-2 16:56:42 | 显示全部楼层
回复 1# ge_xin_yu


    我也不懂怎么搞,同盼高人指点,在此给出达到目的的方法。
  1. @echo off &setlocal enabledelayedexpansion
  2. set c=0
  3. :l
  4. set r=%random%
  5. for /f "delims=" %%j in (sample.xml) do (
  6.         set a=%%j
  7.         set var=!a:page=%r%!
  8.         echo  替换后的值: !var!
  9. )
  10. set/a c+=1
  11. if %c% geq 2 (goto end) else goto l
  12. :end
  13. pause
复制代码
 楼主| 发表于 2014-3-2 17:27:24 | 显示全部楼层
回复  ge_xin_yu


    我也不懂怎么搞,同盼高人指点,在此给出达到目的的方法。
battab 发表于 2014-3-2 16:56



    感谢!去掉一层嵌套是可以正常替换,但加了一层for为什么就不行呢,我想搞清楚如果在两层for中变量嵌套的话该如何写。原文件大概有一千个多个相似的语句,用for最为简洁。
发表于 2014-3-2 17:42:44 | 显示全部楼层
变量中不允许两组感叹号存在吗?

是的
发表于 2014-3-2 17:45:38 | 显示全部楼层
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,2) do (
  4.     set r=!random!
  5.     call :Change_Str !r!
  6. )
  7. pause
  8. goto :eof

  9. :Change_Str
  10. for /f "delims=" %%j in (sample.xml) do (
  11.     set a=%%j
  12.     set var=!a:page=%1!
  13.     echo  替换后的值: !var!
  14. )
复制代码
 楼主| 发表于 2014-3-2 22:55:49 | 显示全部楼层
Batcher 发表于 2014-3-2 17:45



成功解决,强烈感谢,谨祝愉快!!
发表于 2014-3-3 11:24:49 | 显示全部楼层
本帖最后由 zhanglei1371 于 2014-3-3 11:41 编辑

回复 1# ge_xin_yu


    可以再加一层for来解决:
  1. for /l %%i in (1,1,2) do (
  2.   set r=!random!
  3.   for /f "delims=" %%j in (sample.xml) do (
  4.   set a=%%j
  5.   for %%s in (!r!) do (
  6.   set var=!a:page=%%s!
  7.   echo  替换后的值: !var!)
  8.   )
  9. )
复制代码
或用sed
  1. for /l %%i in (1,1,2) do (
  2.   set r=!random!
  3.   for /f "delims=" %%j in (sample.xml) do (
  4.   set a=%%j
  5. echo 替换后的值为: "!a!"|sed "s/page/!r!/g"
  6.   )
  7. )
复制代码
发表于 2014-3-3 12:23:02 | 显示全部楼层
回复 7# zhanglei1371


内层for循环可以省去
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,2) do (
  4.     set r=!random!
  5.     sed "s/page/!r!/g" sample.xml
  6. )
复制代码
发表于 2014-3-3 13:54:53 | 显示全部楼层
回复 8# DAIC


    谢谢,问题是如要要原样显示出这几个字:”替换后的值为:“,不用内层for的话怎么做到?
另外还想请教下,
set a=abcd
echo !a!|sed "/s/b/000/",
用sed将b替换为000,后可得到,那么如要赋予变量str
最后可得到:
echo !str!显示为a000cd
这个过程该如何操作?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 01:04 , Processed in 0.033596 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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