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

[其他] [已解决]批处理复合语句中是否能使用跳转语句?

复合语句中能用跳转语句吗?我发现复合语句中用跳转语句,它就乱跳,不知道跳到哪里去了
请大家看看下面的代码
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,3) do (
  4.         echo 第%%a次
  5.         set str=
  6.         set /p str=请输入:
  7.         if defined str (
  8.                 :loopStr
  9.                 set strChar=!str:~0,1!
  10.                 set str=!str:~1!
  11.                 if defined str (
  12.                         goto loopStr
  13.                 ) else (
  14.                         goto endLoopStr
  15.                 )
  16.                 :endLoopStr
  17.                 echo .>nul
  18.         ) else (
  19.                 echo ============================
  20.         )
  21. )
复制代码
如果我第一次输入abc
那么执行结果应该是不输出任何结果,并进行第2、3次循环

但事实上我输入abc
执行结果中竟然输出了============================,并且停止了循环

[ 本帖最后由 summerflower 于 2010-2-24 18:16 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2
我是一只小菜鸟,飞到东来飞到西……

复合语句有很多种的呀, 都可以使用跳转语句.
但是使用的结果会有差异, 要看是否需要返回等等.

乱跳的情况没遇到过 -.-  你说说你情况 一起学习啦!

TOP

用是肯定能用的,问题在于怎么用..
OrzDEF

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%a in (1,1,3) do (
  4. echo 第%%a次
  5. set str=
  6. set /p str=请输入:
  7. if defined str (
  8. :loopStr
  9. set strChar=!str:~0,1!
  10. set str=!str:~1!
  11. if defined str (
  12. goto loopStr
  13. ) else (
  14. goto endLoopStr
  15. )
  16. :endLoopStr
  17. echo .>nul
  18. ) else (
  19. echo ============================
  20. )
  21. )
复制代码


如果我第一次输入abc
那么执行结果应该是不输出任何结果,并进行第2、3次循环

但事实上我输入abc
执行结果中竟然输出了============================,并且停止了循环


大家看看仔细看看这段程序吧
我是一只小菜鸟,飞到东来飞到西……

TOP

for中的goto会直接跳出循环,只能用call的...
OrzDEF

TOP

你要做啥  = =?
OrzDEF

TOP

是这样的,我在变量dst中存储目标目录(目标目录只有一个),在变量src中存放源文件或源文件夹(源文件或文件夹有多个,用分号隔开)


处理过程:
如果源文件或文件夹的数目大于等于2(
    循环分析出每一个源文件或文件夹(
        如果源是文件夹(
            在目标文件夹中建立子目录
            将源文件夹中的内容拷贝到新建立的子目录中
       ) else (
            直接将源文件拷贝到目标文件夹
       )
    )
) else (
     直接将源文件或文件夹里的内容拷贝到目标文件夹


我写的思路能看懂吗?
我是一只小菜鸟,飞到东来飞到西……

TOP

  1. @echo off
  2. setlocal
  3. setlocal enabledelayedexpansion
  4. rem 从文件中读取目标目录和源文件或文件夹
  5. rem 文件的第一行是目标目录,后面的行是源文件或文件夹
  6. rem 不管是目标还是源的文件夹,最后都不以"\"结尾
  7. set srccnt=0
  8. set dst=
  9. set src=
  10. for /f "delims=" %%a in (1.txt) do (
  11.         if not defined dst (
  12.                 set dst=%%a
  13.         ) else (
  14.                 if defined src (
  15.                         set src=!src!;%%a
  16.                 ) else (
  17.                         set src=%%a
  18.                 )
  19.                 set /a srccnt+=1
  20.         )
  21. )
  22. set srctmp=
  23. if %srccnt% geq 2 (
  24.         :loopSrc
  25.         set srcChar=!src:~0,1!
  26.         set src=!src:~1!
  27.         if "!srcChar!"==";" (
  28.         
  29.                 rem 判断srctmp是文件还是目录
  30.                 set isDir=true
  31.                 set cnt=0
  32.                 set lst=
  33.                 for /f %%a in ('dir /b !srctmp!') do (
  34.                         set lst=%%~dpnxa
  35.                         set /a cnt+=1
  36.                 )
  37.                 if !cnt!==1 (
  38.                         if /i !lst!==!srctmp! (
  39.                                 set isDir=false
  40.                         )
  41.                 )
  42.                
  43.                 rem 如果要拷贝的源是目录,那么先建立子目录,再拷贝。
  44.                 rem 如果是文件,直接将源拷到目标文件夹就可以了
  45.                 if !isDir!==true (
  46.                         for /d %%a in ("!srctmp!") do (
  47.                                 md !dst!\%%~na
  48.                                 xcopy /s /e !srctmp! !dst!\%%~na\>nul
  49.                         )
  50.                 ) else (
  51.                         copy !src! !dst!\>nul
  52.                 )
  53.                
  54.                 set srctmp=
  55.         ) else (
  56.                 if defined srctmp (
  57.                         set srctmp=!srctmp!!srcChar!
  58.                 ) else (
  59.                         set srctmp=!srcChar!
  60.                 )
  61.         )
  62.         if defined src (
  63.                 goto loopSrc
  64.         ) else (
  65.                 goto endLoopSrc
  66.         )
  67.         :endLoopSrc
  68.         rem 判断是文件还是目录
  69.         set cnt=0
  70.         set lst=
  71.         set isDir=true
  72.         for /f "delims=" %%a in ('dir /b !srctmp!') do (
  73.                 set /a cnt+=1
  74.                 set lst=%%~dpnxa
  75.         )
  76.         
  77.         if !cnt!==1 (
  78.                 if /i !srctmp!==!lst! (
  79.                         set isDir=false
  80.                 )
  81.         )
  82.         
  83.         rem 如果要拷贝的源是目录,那么先建立子目录,再拷贝。
  84.         rem 如果是文件,直接将源拷到目标文件夹就可以了
  85.         if !isDir!==true (
  86.                 for /d %%a in ("!srctmp!") do (
  87.                         md !dst!\%%~na
  88.                         xcopy !srctmp! !dst!\%%~na>nul
  89.                 )
  90.         ) else (
  91.                 copy !srctmp! !dst!\>nul
  92.         )
  93.         
  94.         
  95. ) else (
  96.         xcopy /s /e %src% %dst%\>nul
  97. )
  98. endlocal
复制代码

1.txt的内容
  1. d:\mydocument\dos练习\测试
  2. d:\mydocument\dos练习\临时笔记
  3. d:\mydocument\dos练习\1.bat
复制代码

[ 本帖最后由 summerflower 于 2010-2-19 16:20 编辑 ]
我是一只小菜鸟,飞到东来飞到西……

TOP

我怎么完全看不懂吖...
OrzDEF

TOP

看不懂就算了吧,帮我看看第一段代码的问题如何解决
我把goto换成了call
结果call的行为跟goto是一样的
我是一只小菜鸟,飞到东来飞到西……

TOP

换成了call。您真聪明吖。
您。语言表达能力比我还差。
劝您。去论坛搜索一下。
OrzDEF

TOP

这样简单点行不?
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%a in (1.txt) do (
  3.     if defined dst (
  4.        if exist "%%a\" (
  5.           xcopy "%%a" /Y /H /R "!dst!\%%~nxa" >nul 2>nul
  6.           ) else copy "%%a" "!dst!"
  7.        ) else  set "dst=%%a"
  8.    )
  9. )
  10. pause
复制代码
1

评分人数

TOP

terse大大真是助人为乐 =v=
还有terse大大语文满分的吧 =v=  帮我解释一下LZ的意思
OrzDEF

TOP

回复 7楼 的帖子

为了方便他人查看,能否把问题描述和代码全部更新到顶楼?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

非常感谢terse,你的代码可行

只是想问一下xcopy "%%a" /Y /H /R "!dst!\%%~nxa" >nul 2>nul这条语句为什么还要加上2>nul呢?

也谢谢Secter,其实我要实现的功能,简单的说,就是把源文件或文件夹拷贝到目标目录中去
我是一只小菜鸟,飞到东来飞到西……

TOP

返回列表