中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-23 13:32
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,273 会员排行
DOS批处理 & 脚本技术(批处理室) » (已结)启动延缓环境变量的问题
可打印版本  1,724 / 6
第1楼 linson 发表于 2005-06-27 00:00
中级用户 发帖 31 积分 283
(已结)启动延缓环境变量的问题

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

[ Last edited by willsort on 2005-8-2 at 21:10 ]
第2楼 Climbing 发表于 2005-06-28 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
@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楼 willsort 发表于 2005-06-28 00:00
元老会员 发帖 1,512 积分 4,432
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 ]
第4楼 Climbing 发表于 2005-06-29 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
谢谢指教,还是我考虑不周全,因为我很少这样用,只是照猫画虎,画虎不成反类其犬了。照willsort的意思,批处理应该改成这样,假设批处理名叫chgcskey.cmd:


[ Last edited by willsort on 2005-8-2 at 21:12 ]
第5楼 smileseeker 发表于 2005-07-08 00:00
中级用户 发帖 83 积分 316
hoho原来EOF和:EOF有这样的区别啊
第6楼 willsort 发表于 2005-07-26 21:49
元老会员 发帖 1,512 积分 4,432
Re Climbing:

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

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

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

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

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



[ Last edited by willsort on 2005-7-27 at 13:48 ]
第7楼 treey 发表于 2005-07-27 08:31
初级用户 发帖 15 积分 62
谢谢willsort大哥!受教了!
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023