中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-01 11:32
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)启动延缓环境变量的问题 查看 1,586 回复 6
楼 主 (已结)启动延缓环境变量的问题 发表于 2005-06-27 00:00 ·  中国 福建 厦门 电信
中级用户
积分 283
发帖 31
注册 2004-03-06 00:00
22年会员
UID 19334
性别 男
状态 离线

%comspec% /V:ON
::cdkey.txt文件中有4个cdkey
set /A cd=%random%"%%"4
set /A b=%cd%+1
set /A a=0
for /f %%i in (D:\game\本地游戏\CS1.5中文硬盘版\CS1.5中文硬盘版\cdkey.txt) do set /A a=a+1 && if "!a!"=="%b%" set cdkey=%%i && goto EOF
:EOF
echo Windows Registry Editor Version 5.00 > c:\123.reg
echo.>> c:\123.reg
echo >> c:\123.reg
echo "Key"="%cdkey%" >> c:\123.reg

问题是这样的:因为bat中需要启动延缓环境变量扩展,所以要执行%comspec% /V:ON
不过现在当执行到%comspec% /V:ON 时就停了。请教一下如何解决这个问题?

[ Last edited by willsort on 2005-8-2 at 21:10 ]
2 发表于 2005-06-28 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
@echo off
if "%1" == "" start %comspec% /V:ON /C %0.bat $
::cdkey.txt文件中有4个cdkey
set /A cd=%random%"%%"4
set /A b=%cd%+1
set /A a=0
for /f %%i in (D:\game\本地游戏\CS1.5中文硬盘版\CS1.5中文硬盘版\cdkey.txt) do set /A a=a+1 && if "!a!"=="%b%" set cdkey=%%i &&goto EOF
:EOF
echo Windows Registry Editor Version 5.00 > c:\123.reg
echo. >> c:\123.reg
echo >> c:\123.reg
echo "Key"="%cdkey%" >> c:\123.reg
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
3 发表于 2005-06-28 00:00 ·  中国 山西 运城 联通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re Climbing:
  第一句之后应再加一句类似 &&goto end 的语句,或者在第一句之下插入一行 if "%1"=="" goto end 的语句,然后再程序的最后加上 :end标签。否则,程序会出现“重入”问题,即当 %comspec% /c 执行完 %0.bat 之后,程序流程返回 %0.bat ,然后执行第二句以及其后的语句。
Re linson:
  建议不要在程序中使用 :EOF 标签,因为它是NT系列命令解释器 cmd.exe 预定义的标签,意指程序文本的末尾,这样使用会产生很多细节上的问题,比如使用 goto EOF 或者 goto eof 会跳转的你所定义的标签,而使用 goto :EOF 或者 goto :eof 则会跳转到程序文本的末尾。
  另外,建议在类似 :EOF 或者 :end 之类的标签后不要跟随任何代码,一者可以避免阅读上所产生的误导,另外也可以保留一个可以确保在程序最末尾的标签,以利于某些嵌套执行的子程序结束子进程。
  例如,在以上程序中,需要在 %comspec% /c %0 之后就结束整个程序,通常的做法正如我向 Climbing 兄提到的,在第一句之后添加 && goto end,本来更常件的办法是 goto eof,因为它可以不用再文本末尾显式地定义一个 :EOF 标签,但因为此时 :eof 已被你挪作它用,不再表示程序的文本末尾,所以不能用它跳转了。

[ Last edited by willsort on 2005-7-15 at 12:30 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
4 发表于 2005-06-29 00:00 ·  中国 河北 石家庄 联通
铂金会员
★★★★
网络独行侠
积分 6,962
发帖 2,753
注册 2003-04-16 00:00
23年会员
UID 1565
性别 男
来自 河北保定
状态 离线
谢谢指教,还是我考虑不周全,因为我很少这样用,只是照猫画虎,画虎不成反类其犬了。照willsort的意思,批处理应该改成这样,假设批处理名叫chgcskey.cmd:

@echo off
if "%1" == "" start %comspec% /V:ON /C %0 $ && goto eof
::cdkey.txt文件中有4个cdkey
set /A cd=%random%"%%"4
set /A b=%cd%+1
set /A a=0
for /f %%i in (D:\game\本地游戏\CS1.5中文硬盘版\CS1.5中文硬盘版\cdkey.txt) do set /A a=a+1 && if "!a!"=="%b%" set cdkey=%%i &&goto chgkey
:chgkey
echo Windows Registry Editor Version 5.00 > c:\123.reg
echo. >> c:\123.reg
echo >> c:\123.reg
echo "Key"="%cdkey%" >> c:\123.reg
regedit /s c:\123.reg


[ Last edited by willsort on 2005-8-2 at 21:12 ]
偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
5 发表于 2005-07-08 00:00 ·  中国 福建 三明 电信
中级用户
★★
积分 316
发帖 83
注册 2005-03-01 00:00
21年会员
UID 36626
性别 男
状态 离线
hoho原来EOF和:EOF有这样的区别啊
6 发表于 2005-07-26 21:49 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re Climbing:

  补充两点我前述中没有注意到的问题:

  我注意到你调用%comspec%时使用了start,这有一个小问题,就是start会创建新窗口来调用%comspec%,因此运行时会有黑屏闪过。当然,可以使用“/b”参数来避免创建新窗口,但是可以不用这样麻烦,直接使用%comspec%即可。

  据我所知,start启动的进程结束后,不会设置%errorlevel%,这对本程序来说是有利的,因为后面使用了&&连接goto :EOF,它可以在cmd返回假值(非0的%errorlevel%)时仍然goto。但是对大部分程序来说,都是不利的,很多时候我们需要根据%errorlevel%决定第二语句的运行与否;如果仅想连续运行两个语句,使用单个“&”就够了。

  另外,“goto eof”只能返回自定义的 :eof 标签,而预定义的 :eof 需要使用 goto :eof,冒号是不可省略的。

  下面是我对程序第一句的修改稿:

if "%1" == "" %comspec% /V:ON /C %0 cmdshell & goto :eof


[ Last edited by willsort on 2005-7-27 at 13:48 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
7 发表于 2005-07-27 08:31 ·  中国 福建 厦门 电信
初级用户
积分 62
发帖 15
注册 2005-07-23 10:50
21年会员
UID 40952
性别 男
状态 离线
谢谢willsort大哥!受教了!
论坛跳转: