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

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

有三个文件,
  • 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 编辑 ]
1

评分人数

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

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 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 2楼 的帖子

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

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

TOP

允许传递参数带引号并使用带空格的绝对路径
  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 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 4楼 的帖子

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

TOP

    set t=!t:[lower]=%%i!
        set t=!t:[upper]=%%j!

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

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

[ 本帖最后由 hanyeguxing 于 2010-5-12 17:33 编辑 ]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

回复 6楼 的帖子

我是昨天才开始研究BAT方面知识的,所以欠缺了很多。
谢谢你的回复。我继续研究一下,如有不懂,还请多多帮助。

TOP

请将主题前加 [已解决]
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表