Board logo

标题: [求助]for内部和外部变量延迟有何不同 [打印本页]

作者: btpg     时间: 2010-5-8 12:52    标题: [求助]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
哪位能帮忙解释下,这两个代码,有什么本质不同吗?
作者: Hanyeguxing     时间: 2010-5-8 14:22
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多余。。。
作者: btpg     时间: 2010-5-8 14:50


  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 ]
作者: Hanyeguxing     时间: 2010-5-8 22:16
第二个,启用延迟的环境变量扩展,直到出现匹配的 endlocal ,结束批处理文件中环境更改的本地化,将环境变量还原为匹配 setlocal enabledelayedexpansion 命令前的值