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

[文本处理] [已解决]在使用setlocal enabledelayedexpansion时,得到的结果不一样

感谢2~4楼的帮助,问题得到解决。
在这里总结一下:
例1:
  1. @echo off
  2. set str_01=!First
  3. set str_02=!First!Second
  4. set str_03=First!
  5. set str_04=First!Second!
  6. set str_05=!First!Second!
  7. set str_06=!First!Second!Three
  8. set str_07=First!Second!Three
  9. echo %str_01%
  10. echo %str_02%
  11. echo %str_03%
  12. echo %str_04%
  13. echo %str_05%
  14. echo %str_06%
  15. echo %str_07%
  16. pause
复制代码
[attach]6246[/attach]

例2
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str_01=!First
  4. set str_02=!First!Second
  5. set str_03=First!
  6. set str_04=First!Second!
  7. set str_05=!First!Second!
  8. set str_06=!First!Second!Three
  9. set str_07=First!Second!Three
  10. echo %str_01%
  11. echo %str_02%
  12. echo %str_03%
  13. echo %str_04%
  14. echo %str_05%
  15. echo %str_06%
  16. echo %str_07%
  17. endlocal
  18. pause
复制代码
[attach]6247[/attach]
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set First=Bathome
  4. set str_01=!First
  5. set str_02=!First!Second
  6. set str_03=First!
  7. set str_04=First!Second!
  8. set str_05=!First!Second!
  9. set str_06=!First!Second!Three
  10. set str_07=First!Second!Three
  11. echo %str_01%
  12. echo %str_02%
  13. echo %str_03%
  14. echo %str_04%
  15. echo %str_05%
  16. echo %str_06%
  17. echo %str_07%
  18. endlocal
  19. pause
复制代码
[attach]6248[/attach]

总结:在开启变量延迟后,感叹号!会被当成变量引用符号。如果变量没有被定义,则不会显示,反之会替换变量。
http://www.bathome.net/thread-1224-1-1.html

感谢三楼说了一种情况是感叹号和冒号同时存在的情况,加深了bat对符号处理的机制。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. echo !v:01
  4. echo !v:01!
  5. set "v=aaa"
  6. set v:01=bathome
  7. echo !v:01
  8. echo !v:01!
  9. echo !v!:01
  10. pause
复制代码
[attach]6249[/attach]

详见:
http://tieba.baidu.com/p/1020906001
http://www.bathome.net/thread-3768-1-1.html

---------------------------------------------------------------------------------------------华丽分割线-----------------------------------------------------------------------------

先附上代码:
  1. @echo off
  2. for %%i in (.\*.xml) do (
  3.     for /f "usebackq delims=" %%j in ("%%i") do (
  4.     echo %%j>1.txt
  5.     )
  6. )
  7. pause
复制代码
查看1.txt内容是:
<?xml version="1.0" encoding="gb2312" ?><result><count>5</count><url><encode><![CDATA[http://zhangmen**ing.baidu.com/d ... sa2hpb2dnaGRpZmtvMQ$$]]></encode><decode><![CDATA[38359767.mp3?xcode=8d526eaa03b87b2967a477b1c0900709&mid=0.08622765504047]]></decode><type>8</type><lrcid>0</lrcid><flag>0</flag></url><durl><encode><![CDATA[http://zhangmen**ing2.baidu.com/ ... sa2hpb2dnaGRpZmtvMQ$$]]></encode><decode><![CDATA[38359801.mp3?xcode=8d526eaa03b87b2967a477b1c0900709&mid=0.08622765504047]]></decode><type>8</type><lrcid>0</lrcid><flag>0</flag></durl><url><encode><![CDATA[http://content.12530.com/upload/ ... b2hhY2ZslGZnaGFjbDQ$.mp3]]></encode><decode><![CDATA[000040800138_000019.mp3]]></decode><type>1</type><lrcid>0</lrcid><flag>0</flag></url><durl></durl><url><encode><![CDATA[http://www.climber.cn/audio/pZuUoqGrNw$$.mp3]]></encode><decode><![CDATA[tianlu.mp3]]></decode><type>1</type><lrcid>0</lrcid><flag>0</flag></url><durl></durl><url><encode><![CDATA[http://www.chinamil.com.cn/site1 ... sic/ZGphoaVpdq-plTM$]]></encode><decode><![CDATA[38.mp3?wxc]]></decode><type>8</type><lrcid>0</lrcid><flag>0</flag></url><durl></durl><url><encode><![CDATA[http://www.lcyg.cn/amelia/music/pZuUoqGrNw$$.Wma]]></encode><decode><![CDATA[tianlu.Wma]]></decode><type>3</type><lrcid>0</lrcid><flag>0</flag></url><durl></durl><p2p><hash>0d18e8ac974b98c5a5bbbf1007aad5d0eeb22fd6</hash><url><![CDATA[]]></url><type>mp3</type><size>6785939</size><bitrate>192</bitrate></p2p></result>
目前输出的内容是原文件的内容,但当我加上setlocal enabledelayedexpansion这句时,问题出现了,如下所示的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for %%i in (.\*.xml) do (
  4.     for /f "usebackq delims=" %%j in ("%%i") do (
  5.     echo %%j>1.txt
  6.     )
  7. )
  8. endlocal
  9. pause
复制代码
这个时候1.txt的内容如下:
<?xml version="1.0" encoding="gb2312" ?><result><count>5</count><url><encode><//zhangmen**ing.baidu.com/data2/music/38359767/ZGpmaW5tbW9fn6NndK6ap5WXcGyZa2lulpOUZGiYb2-TZGxqbJdrb2iUZJdlb2doaGJsWqKfm3VhYGNsa2hpb2dnaGRpZmtvMQ$$]]></encode><decode><[CDATA[http://zhangmen**ing2.baidu.com/ ... sa2hpb2dnaGRpZmtvMQ$$]]></encode><decode><[CDATA[http://content.12530.com/upload/ ... b2hhY2ZslGZnaGFjbDQ$.mp3]]></encode><decode><[CDATA[http://www.climber.cn/audio/pZuUoqGrNw$$.mp3]]></encode><decode><[CDATA[http://www.chinamil.com.cn/site1 ... sic/ZGphoaVpdq-plTM$]]></encode><decode><[CDATA[http://www.lcyg.cn/amelia/music/pZuUoqGrNw$$.Wma]]></encode><decode><[CDATA[]]></url><type>mp3</type><size>6785939</size><bitrate>192</bitrate></p2p></result>
这个时候输出的内容不是原文件的内容。
百思不得其解,开启变量延迟后,读取文本的内容为什么会不一样呢?


附件如下,需将.txt删除
[attach]6243[/attach]
1

评分人数

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

感叹号

TOP

!aaa:ccc

这种情况,aaa没有定义为变量的话会直接去掉。变为ccc

TOP

TOP

话说bathome和wuyou神马关系??今天才发现..以前是直接bathome的域名访问的..,

TOP

返回列表