Board logo

标题: (已结)启动延缓环境变量的问题 [打印本页]

作者: linson     时间: 2005-6-27 00:00    标题: (已结)启动延缓环境变量的问题
%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 [HKEY_CURRENT_USER\Software\Valve\CounterStrike\Settings] >> 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 ]

作者: Climbing     时间: 2005-6-28 00:00
@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 [HKEY_CURRENT_USER\Software\Valve\CounterStrike\Settings] >> c:\123.reg echo "Key"="%cdkey%" >> c:\123.reg

作者: willsort     时间: 2005-6-28 00:00
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 ]

作者: Climbing     时间: 2005-6-29 00:00
谢谢指教,还是我考虑不周全,因为我很少这样用,只是照猫画虎,画虎不成反类其犬了。照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 [HKEY_CURRENT_USER\Software\Valve\CounterStrike\Settings] >> 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 ]

作者: smileseeker     时间: 2005-7-8 00:00
hoho原来EOF和:EOF有这样的区别啊

作者: willsort     时间: 2005-7-26 21:49
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 ]

作者: treey     时间: 2005-7-27 08:31
谢谢willsort大哥!受教了!