我给你的代码做下注释。 你自己看看错在哪。$var = DriveGetDrive("CDROM") ;调用库函数获取光驱的个数和盘符。返回类型为数组$var,其中$var[0]代表光驱个数。
;$var[1]到$var[n]是光驱的盘符。
dim $exe,$reg,$bat ;定义这3个变量是干什么的? 本代码中没用到过。
$s1 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s1") ;从注册表中读出HKEY_LOCAL_MACHINE\SOFTWARE\Temp下的s1的值。
$s2 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s2") ;以下同,省略不写了。
$s3 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s3")
$s4 = RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s4")
;这里有个疑问,如果该注册表中没有HKEY_LOCAL_MACHINE\SOFTWARE\Temp键,返回值是个空值。这个判断无效。
;建议读注册表之前先判断注册表中有没有HKEY_LOCAL_MACHINE\SOFTWARE\Temp键,没有的话直接执行IF中的那段代码。
;~ 成功: 返回指定值项的数据. @EXTENDED 设置类型为 $REG_... 值的类型,这些类型定义于 "Constants.au3" 包含文件.
;~ 失败: 返回空字符串 "",并把 @error 设为以下值之一:
;~ 1 如果不能打开被请求的键
;~ 2 如果不能打开被请求的主键
;~ 3 如果不能远程连接到注册表
;~ -1 如果不能打开被请求的值
;~ -2 如果值的类型是不支持的
;~ 帮助中的说明如上,很显然,如果不存在该注册表项目,@error的值是2,
;~ 你的NOT @error 并不是1,所以,第一个判断就失效,程序直接退出了
;~ 如果存在该主键而不存在子健,那么@error的值是1,NOT @error的值是0,IF判断也不会继续执行。
;~ 所以,你的程序在执行之初不管运行了与否,都首先判断注册表中有没有Temp键和其下的4个子健。
;~ 如果没有则直接执行下面的相应代码。如果有才进行判断。
;~ 判断方法是:
;~ 1.直接RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s1")这4句,然后从@error返回值来判断。
;~ 2.RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", 1)……RegEnumVal("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", 4),
;~ 还是根据@error返回值来判断。
;~ 可以将下面的FOR循环中的所有代码定义成一个子函数,需要调用的时候直接调用函数名就可以少写许多代码。
If Not @error Then ;如果注册表读取成功才执行下面的代码,否则不执行。
For $i = 1 To $var[0] ;定义变量$i用来获取光驱盘符。
DirCopy($var[$i] & '\常用软件', "c:\常用软件", 1)
if $s1 = 0 then ;读取出的$s1为0才执行。
RunWait("C:\WINDOWS\Temp\快速设定分辨率.exe")
Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s1","REG_SZ","1")
EndIf
if $s2 = 0 Then ;读取出的$s2为0才执行。
RunWait("C:\WINDOWS\Temp\一键填写IP192.168.1.110.bat","",@SW_HIDE)
Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s2","REG_SZ","1")
EndIf
if $s3 = 0 then ;读取出的$s3为0才执行。
RunWait("C:\WINDOWS\Temp\智能关闭无用服务.bat","",@SW_HIDE)
Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s3","REG_SZ","1")
EndIf
if $s4 = 0 Then ;读取出的$s4为0才执行。
RunWait("C:\常用软件\SOFTINST.EXE")
Regwrite("HKEY_LOCAL_MACHINE\SOFTWARE\Temp", "s4","REG_SZ","1")
EndIf
Next
EndIf
|