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

[文本处理] [已解决]批处理嵌套for变量无法正确赋值无法正确替换字符

[复制链接]
发表于 2010-5-12 15:56:03 | 显示全部楼层 |阅读模式
有三个文件,
  • config.txt:其中是以逗号分开的两列值
a;A
b;B
c;C
d;D
  • source.txt:
This is lower case:[lower]
This is upper case:[upper]
  • test.bat 是用来创建以config.txt文件中第一列为命名的txt文件,这些文件的内容模板是source.txt,然后把创建好的文件中的[lower],[upper]用config.txt的相应行来替换。如a.txt的内容为:
This is lower case:a
This is upper case:A
test.bat的使用格式是:test.bat config.txt source.txt 其内容为:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. md tempfolder
  4. for /f "tokens=1,2 delims=;" %%i in (%1) do (
  5.     for /f "delims=" %%m in (%2) do (        
  6.         set temp=%%m
  7.         @echo %%i
  8.         @echo %temp%
  9.         @echo %temp:[lower]=%%i%>>tempfolder\i%%.txt
  10.     )
  11. )
复制代码

这个例子并没有实现我想要的结果。特别是红色标注的两句,不知道错在那里,还请仔细分析指出。谢谢。



[ 本帖最后由 z_l_106 于 2010-5-12 17:47 编辑 ]

评分

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

查看全部评分

发表于 2010-5-12 16:50:30 | 显示全部楼层
0,能不用for嵌套解析文件就不用!
1,楼主定义%mylangs%这个变量了吗?
2,echo %temp:[lower]=i%%%,变量%%i写反了,没使用!延迟。
3,为什么不能把source.txt直接写到批处理test.bat里呢?
4,config.txt的内容也可以直接写到批处理test.bat的。
  1. @echo off
  2. md tempfolder
  3. for /f "tokens=1,2 delims=;" %%a in ('more +8^<"%~fs0"') do (
  4. >%%a.txt echo.This is lower case:%%a
  5. >>%%a.txt echo.This is upper case:%%b
  6. )
  7. exit
  8. ;上面的行数不能动.下面为相关信息.其中分隔符;在delims=中指定.本行不能删
  9. a;A
  10. b;B
  11. c;C
  12. d;D
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-12 17:01 编辑 ]
 楼主| 发表于 2010-5-12 17:08:53 | 显示全部楼层

回复 2楼 的帖子

%mylangs%应该是%temp%
%temp:[lower]=%%i%
非常感谢二楼的回复。
这个分成几个文件也是可以的吧,只是想到了这样来组织,还烦请指点一下!

[ 本帖最后由 z_l_106 于 2010-5-12 17:10 编辑 ]
发表于 2010-5-12 17:19:04 | 显示全部楼层
允许传递参数带引号并使用带空格的绝对路径
  1. @echo off&setlocal EnableDelayedExpansion
  2. md tempfolder
  3. for /f "usebackq tokens=1,2 delims=;" %%i in ("%~1") do (
  4.     for /f "usebackq delims=" %%m in ("%~2") do (        
  5.         set t=%%m
  6.         set "t=!t:[lower]=%%i!"
  7.         set "t=!t:[upper]=%%j!"
  8.         echo.!t!
  9.     )
  10. )>tempfolder\%%i.txt
复制代码
或是:
  1. @echo off
  2. md tempfolder
  3. for /f "usebackq tokens=1,2 delims=;" %%i in ("%~1") do (
  4.     setlocal EnableDelayedExpansion
  5.     (for /f "usebackq delims=" %%m in ("%~2") do (        
  6.         set t=%%m
  7.         set "t=!t:[lower]=%%i!"
  8.         set "t=!t:[upper]=%%j!"
  9.         echo.!t!
  10.     )
  11.     )>tempfolder\%%i.txt
  12.     Endlocal
  13. )
复制代码

[ 本帖最后由 hanyeguxing 于 2010-5-12 17:27 编辑 ]

评分

参与人数 1PB +10 收起 理由
Batcher + 10 乐于助人

查看全部评分

 楼主| 发表于 2010-5-12 17:26:52 | 显示全部楼层

回复 4楼 的帖子

太感谢了,都不知道用什么语言来表达了。
问了好几个同事,可惜都不怎么懂。
    set t=!t:[lower]=%%i!
        set t=!t:[upper]=%%j!
        echo.!t!
这三行,能否帮我解释一下,我们有的同事说在for内不能定义变量,我也试了,值会不对。有什么原理,还请指点?关于替换,为什么我写的%temp:[lower]=%%i%不对?麻烦了!
发表于 2010-5-12 17:29:38 | 显示全部楼层
    set t=!t:[lower]=%%i!
        set t=!t:[upper]=%%j!

查看set的语法中的替换变量部分
为什么我写的%temp:[lower]=%%i%不对?

查看set的语法中的变量延迟部分
或者在本论坛内搜索相关教程主题
ps :很奇怪,楼主都知道用setlocal EnableDelayedExpansion了,为什么不知道用“!”呢?

[ 本帖最后由 hanyeguxing 于 2010-5-12 17:33 编辑 ]
 楼主| 发表于 2010-5-12 17:36:57 | 显示全部楼层

回复 6楼 的帖子

我是昨天才开始研究BAT方面知识的,所以欠缺了很多。
谢谢你的回复。我继续研究一下,如有不懂,还请多多帮助。
发表于 2010-5-12 17:41:30 | 显示全部楼层
请将主题前加 [已解决]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 02:32 , Processed in 0.023885 second(s), 11 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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