中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-04 20:29
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » IF中能嵌套CALL命令? 查看 931 回复 6
楼 主 IF中能嵌套CALL命令? 发表于 2007-05-31 11:24 ·  中国 广东 汕头 电信
初级用户
积分 57
发帖 23
注册 2007-04-02 04:52
19年会员
UID 83682
性别 男
状态 离线
IF中嵌套CALL命令,为何CALL命令不能得到正确执行。请高手指教。谢谢!
问题如下:


setlocal enabledelayedexpansion
color 0A
set targerpath=c:\temp
set fyyyymm=2007.05
:id_loop
echo.
set id=
set /p id=input the id number:
if "!id!" == "" (
cls
echo error - the id is null¡
echo.
goto id_loop
) else (
pushd !targerpath!\!fyyyymm!
if not exist "!id!" (
md !id!
) else (
popd
echo the !id! exist¡
echo.
:rade_loop
set rade=
set /p rade=renamedeltreeexit
if "!rade!" == "" (
cls
echo error - select the string¡
pause>nul
goto rade_loop
) else (
call :!rade! 2>nul || call :p REM 在这里选择e或r时,CALL命令均调用:P 的这段代码
pause>nul
goto :eof
:p
echo error - select the string!
goto :rade_loop
goto :eof
:e
echo this is exit!
goto :eof

:r
echo this is rename!
goto :eof
)
)
)


[ Last edited by linmilin on 2007-5-31 at 09:33 PM ]
实用就是好东西!
2 发表于 2007-05-31 15:26 ·  中国 湖北 武汉 电信
中级用户
★★
scriptlover
积分 328
发帖 131
注册 2007-03-25 22:17
19年会员
UID 82910
性别 男
状态 离线
call :!rade! 用法错误,应该是call:rade_loop
set /p rade=renamedeltreeexit应该改为set rade=renamedeltreeexit 吧

[ Last edited by stornager on 2007-5-31 at 03:34 PM ]
scriptlover
Be with script forever!!
3 发表于 2007-05-31 15:53 ·  中国 广东 汕头 电信
初级用户
积分 57
发帖 23
注册 2007-04-02 04:52
19年会员
UID 83682
性别 男
状态 离线
Originally posted by stornager at 2007-5-31 03:26 PM:
call :!rade! 用法错误,应该是call:rade_loop
set /p rade=renamedeltreeexit应该改为set rade=renamedeltreeexit 吧

[ Last edited by stornager on 2007-5-31 at 03:34 PM ]


第一:
set /p rade=renamedeltreeexit
这一句是用于与用户进行互动,可以让用户选择条件。

第二:
:rade_loop
此循环是当用户选择的条件非程序设置的条件时进行跳转的。
CALL调用的是以下部分程序:
call :!rade! 2>nul || call :p
pause>nul
goto :eof
:p
echo error - select the string!
goto :rade_loop
goto :eof
:e
echo this is exit!
goto :eof

:r
echo this is rename!
goto :eof
实用就是好东西!
4 发表于 2007-05-31 16:06 ·  中国 浙江 杭州 联通
银牌会员
★★★
积分 1,928
发帖 931
注册 2007-01-06 11:46
19年会员
UID 75624
性别 男
状态 离线
@echo off
:rade_loop
set rade=
set /p rade=renamedeltreeexit
if "%rade%"=="" (
cls
echo error - select the string
pause>nul
goto rade_loop
) else (
call :%rade% 2>nul||call :p
pause>nul
goto :eof
:p
echo error - select the string!
goto :rade_loop
goto :eof
:e
echo this is exit!
pause>nul
goto :eof

:r
echo this is rename!
pause>nul
goto :eof
)


在偶运行看来。就call :%rade%出问题。个人认为没必要启用延迟
5 发表于 2007-05-31 21:20 ·  IANA 局域网IP(Private-Use)
初级用户
积分 57
发帖 23
注册 2007-04-02 04:52
19年会员
UID 83682
性别 男
状态 离线
Originally posted by wudixin96 at 2007-5-31 04:06 PM:
@echo off
:rade_loop
set rade=
set /p rade=renamedeltreeexit
if "%rade%"=="" (
cls
echo error - selec ...



此程序为程序的一部分;要启用延迟.
实用就是好东西!
6 发表于 2007-05-31 22:02 ·  中国 浙江 杭州 联通
银牌会员
★★★
积分 1,928
发帖 931
注册 2007-01-06 11:46
19年会员
UID 75624
性别 男
状态 离线
call :!rade! 2>nul || call :p

第一call后, errorlevel变量变成1,即失败。所以会调用第二个call
7 发表于 2007-06-01 08:56 ·  中国 广东 汕头 电信
初级用户
积分 57
发帖 23
注册 2007-04-02 04:52
19年会员
UID 83682
性别 男
状态 离线
确实是这样,但就是找不出为什么会导致这样的问题。
从程序上说,程序是没问题的。但就是得不到想要的结果。
请不吝赐教。
实用就是好东西!
论坛跳转: