标题: [文本处理] 【已解决】批处理命令for嵌套中怎样使用变量嵌套? [打印本页]
作者: ge_xin_yu 时间: 2014-3-2 14:05 标题: 【已解决】批处理命令for嵌套中怎样使用变量嵌套?
本帖最后由 ge_xin_yu 于 2014-3-4 20:53 编辑
文件sample.xml:- <gfx-1 id="page" group-id="1" />
复制代码
现在想将sample.xml中的字符“page”替换为随机数,输出2次,代码如下:- @echo off & SETLOCAL EnableDelayedExpansion
- for /l %%i in (1,1,2) do (
- set r=!random!
- for /f "delims=" %%j in (sample.xml) do (
- set a=%%j
- set var=!a:page=%r%!
- echo 替换后的值: !var!
- )
- )
- pause
复制代码
运行,输出如下:- <gfx-1 id="" group-id="1" />
- <gfx-1 id="" group-id="1" />
复制代码
没有效果,“page”替换为空,测试发现如果去掉外层的for语句,替换正常。估计和变量延迟有关,于是将set var=!a:page=%r%!改为set var=!a:page=!r!!,运行,却得到了另外的结果,后面多了个“r”,如下:- <gfx-1 id="" group-id="1" /> r
- <gfx-1 id="" group-id="1" /> r
复制代码
也是失败,对这个变量延迟仍然比较糊涂,变量中不允许两组感叹号存在吗?如果在复合语句嵌套中需要嵌套变量,该怎么办呢?另外第二次替换后为何多个“r”呢?请教大家,深致谢意!!
作者: battab 时间: 2014-3-2 16:56
回复 1# ge_xin_yu
我也不懂怎么搞,同盼高人指点,在此给出达到目的的方法。- @echo off &setlocal enabledelayedexpansion
- set c=0
- :l
- set r=%random%
- for /f "delims=" %%j in (sample.xml) do (
- set a=%%j
- set var=!a:page=%r%!
- echo 替换后的值: !var!
- )
- set/a c+=1
- if %c% geq 2 (goto end) else goto l
- :end
- pause
复制代码
作者: ge_xin_yu 时间: 2014-3-2 17:27
回复 ge_xin_yu
我也不懂怎么搞,同盼高人指点,在此给出达到目的的方法。
battab 发表于 2014-3-2 16:56
感谢!去掉一层嵌套是可以正常替换,但加了一层for为什么就不行呢,我想搞清楚如果在两层for中变量嵌套的话该如何写。原文件大概有一千个多个相似的语句,用for最为简洁。
作者: Batcher 时间: 2014-3-2 17:42
是的
作者: Batcher 时间: 2014-3-2 17:45
- @echo off
- setlocal enabledelayedexpansion
- for /l %%i in (1,1,2) do (
- set r=!random!
- call :Change_Str !r!
- )
- pause
- goto :eof
-
- :Change_Str
- for /f "delims=" %%j in (sample.xml) do (
- set a=%%j
- set var=!a:page=%1!
- echo 替换后的值: !var!
- )
复制代码
作者: ge_xin_yu 时间: 2014-3-2 22:55
Batcher 发表于 2014-3-2 17:45
成功解决,强烈感谢,谨祝愉快!!
作者: zhanglei1371 时间: 2014-3-3 11:24
本帖最后由 zhanglei1371 于 2014-3-3 11:41 编辑
回复 1# ge_xin_yu
可以再加一层for来解决:- for /l %%i in (1,1,2) do (
- set r=!random!
- for /f "delims=" %%j in (sample.xml) do (
- set a=%%j
- for %%s in (!r!) do (
- set var=!a:page=%%s!
- echo 替换后的值: !var!)
- )
- )
复制代码
或用sed- for /l %%i in (1,1,2) do (
- set r=!random!
- for /f "delims=" %%j in (sample.xml) do (
- set a=%%j
- echo 替换后的值为: "!a!"|sed "s/page/!r!/g"
- )
- )
复制代码
作者: DAIC 时间: 2014-3-3 12:23
回复 7# zhanglei1371
内层for循环可以省去- @echo off
- setlocal enabledelayedexpansion
- for /l %%i in (1,1,2) do (
- set r=!random!
- sed "s/page/!r!/g" sample.xml
- )
复制代码
作者: zhanglei1371 时间: 2014-3-3 13:54
回复 8# DAIC
谢谢,问题是如要要原样显示出这几个字:”替换后的值为:“,不用内层for的话怎么做到?
另外还想请教下,
set a=abcd
echo !a!|sed "/s/b/000/",
用sed将b替换为000,后可得到,那么如要赋予变量str
最后可得到:
echo !str!显示为a000cd
这个过程该如何操作?
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |