[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

本帖最后由 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”呢?请教大家,深致谢意!!
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 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
复制代码
学习中

TOP

回复  ge_xin_yu


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



    感谢!去掉一层嵌套是可以正常替换,但加了一层for为什么就不行呢,我想搞清楚如果在两层for中变量嵌套的话该如何写。原文件大概有一千个多个相似的语句,用for最为简洁。

TOP

变量中不允许两组感叹号存在吗?

是的
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  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. )
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

Batcher 发表于 2014-3-2 17:45



成功解决,强烈感谢,谨祝愉快!!

TOP

本帖最后由 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. )
复制代码

TOP

回复 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. )
复制代码

TOP

回复 8# DAIC


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

TOP

返回列表