中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]for内部和外部变量延迟有何不同
作者:
标题: [求助]for内部和外部变量延迟有何不同 上一主题 | 下一主题
btpg
新手上路





积分 17
发帖 19
注册 2010-3-22
来自 湖北
状态 离线
『楼 主』:  [求助]for内部和外部变量延迟有何不同

我想把某文件夹里面的文件进行平均分组:

如下代码就出错:
color a&setlocal enabledelayedexpansion
chcp 936&set a=0
for %%a in (*) do if not "%%a"=="文件分组.bat" set /a a+=1
set /a a=%a%/30+1
set /p b=接下来将在本文件夹里新建%a%个文件夹,请输入文件夹前缀,然后回车,(直接回车,则会创建1、2、3……30这些文件夹):
for /l %%a in (1 1 30) do (if defined b md %b%%%a
if not defined b md %%a
)
set c=0
for %%a in (*) do if not "%%a"=="文件分组.bat" (
set /a c+=1
set /a d=!c!/%a%
set /a e=!d!+1
set /a f=!d!*%a%
set /a g=!e!*%a%
echo !d! !e! !f! !g!
if !c! gtr !f! if !c! lss !g! move %%a %b%!e!
if !c! equ !g! move %%a %b%!d!
)
pause
代码改成这样就可以成功:
color a
chcp 936&set a=0
for %%a in (*) do if not "%%a"=="文件分组.bat" set /a a+=1
set /a a=%a%/30+1
set /p b=接下来将在本文件夹里新建%a%个文件夹,请输入文件夹前缀,然后回车,(直接回车,则会创建1、2、3……30这些文件夹):
for /l %%a in (1 1 30) do (if defined b md %b%%%a
if not defined b md %%a
)
set c=0
for %%a in (*) do if not "%%a"=="文件分组.bat" (
setlocal enabledelayedexpansion
set /a c+=1
set /a d=!c!/%a%
set /a e=!d!+1
set /a f=!d!*%a%
set /a g=!e!*%a%
echo !d! !e! !f! !g!
if !c! gtr !f! if !c! lss !g! move %%a %b%!e!
if !c! equ !g! move %%a %b%!d!
endlocal
)
pause
哪位能帮忙解释下,这两个代码,有什么本质不同吗?

2010-5-8 12:52
查看资料  发送邮件  发短消息 网志  OICQ (136949034)  编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 2 楼』:  

1,楼主需要说明自己的设计思路是什么,不然怎么判断代码?
2,第一个怎么出错了?第二怎么对了?
color a
chcp 936多余,默认值
set a=0多余
for %%a in (*) do if not "%%a"=="文件分组.bat" set /a a+=1
set /a a=%a%/30+1
最后a都为1,那不如就直接set a=1
set /p b=接下来将在本文件夹里新建%a%个文件夹,请输入文件夹前缀,然后回车,(直接回车,则会创建1、2、3……30这些文件夹):
for /l %%a in (1 1 30) do (if defined b md %b%%%a
if not defined b md %%a
)
这里只用for /l %%a in (1 1 30) do md %b%%%a就可以了。
set c=0多余。。。



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-5-8 14:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
btpg
新手上路





积分 17
发帖 19
注册 2010-3-22
来自 湖北
状态 离线
『第 3 楼』:  



  Quote:
Originally posted by Hanyeguxing at 2010-5-8 14:22:
1,楼主需要说明自己的设计思路是什么,不然怎么判断代码?
2,第一个怎么出错了?第二怎么对了?
color a
chcp 936多余,默认值
set a=0多余
for %%a ...

没想到我的程序中有这么多多余的地方,谢谢您的指正


我的本意是:某文件夹中有很多同类文件,我想对其进行平均分组,将这些同类文件放到30个文件夹里面,所以设计了上面的程序,但是第一个程序达不到目的,而第二个可以,对于它们只是setlocal enabledelayedexpansion的位置不同,我想知道,setlocal enabledelayedexpansion放在for 内部和for 外部,有什么不同

[ Last edited by btpg on 2010-5-8 at 14:57 ]

2010-5-8 14:50
查看资料  发送邮件  发短消息 网志  OICQ (136949034)  编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 4 楼』:  

第二个,启用延迟的环境变量扩展,直到出现匹配的 endlocal ,结束批处理文件中环境更改的本地化,将环境变量还原为匹配 setlocal enabledelayedexpansion 命令前的值



批处理之家 http://bbs.bathome.net/forum-5-1.html
2010-5-8 22:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: