【已解决】一个关于进程管理的问题
本帖最后由 xiaogou5852 于 2010-12-17 21:05 编辑我这是网吧的电脑,每次开机都有一个进程会往注册表里写东西。
不能阻止它往注册表写东西,不然会出错。
只能等它写完后,我在根据需要写入其他的注册表值。
但是那个进程不是一个固定的进程。有的时候是 PC15.exe有的时候是PC16.exe
唯一的相同点就是有2个PC 字符。
想请问各位大大,怎样判断这个 PC*.exe的进程是否存在? 等待PC*.exe 结束后写入一些值到注册表里?
$list = ProcessList()
for $i = 1 to $list
If StringInStr($list[$i],"PC") Then
MsgBox(0,"进程存在","PID为: " & $list[$i])
ExitLoop
EndIf
next
本帖最后由 xiaogou5852 于 2010-12-15 00:43 编辑
这个我知道,我的意思是。
脚本开始执行以后,如果没发现PC*.exe 进程, 暂停脚本,等待PC*.exe 的出现。
然后等待PC*.exe 进程结束后,
执行 RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Toolbar\WebBrowser","ITBarLayout","REG_BINARY",_
"0x110000005c00000000000000340000001b000000" & _
"520000000100000020070000a00f0000050000006205000026" & _
"0000000200000021070000a00f00000400000021010000a00f" & _
"00000300000028030000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000000000000000" & _
"00000000000000000000000000000000000000") 本帖最后由 xiaogou5852 于 2010-12-15 00:42 编辑
我测试了好多次,都是我的脚本先运行,导入了注册表后 PC*.exe 才出现, 这样的话,PC*.exe 就会修改注册表,所以我希望是等待pc*.exe 结束后在导入注册表。 我用Sleep来延迟脚本,有时可以有时不行, 所以还是希望能搞判断进程来导入。 .........
换一个思路
例如你可以检测注册表是否已被写
或
While 1
$list = ProcessList()
for $i = 1 to $list
If StringInStr($list[$i],"PC") Then
MsgBox(0,"进程存在","PID为: " & $list[$i])
ExitLoop (2)
EndIf
next
Sleep(1)
WEnd
While 1
$list = ProcessList()
For $i = 1 to $list
If StringInStr($list[$i],"PC") Then ;如果判断进程存在则开始循环等待进程结束
While 1
If ProcessExists($list[$i]) = 0 Then ;如果监控的进程已不存在,则开始写入注册表
;写注册表代码
Exit
EndIf
Sleep(1)
WEnd
EndIf
Next
Sleep(250)
WEnd 我想每台机子上的PC某某是固定的吧, 这样你可以把它写入到一个配置文件中去
如果能确定你的脚本是这个进程之前启动的,那么就可以
ProcessWait暂停脚本的执行直至给定进程出现为止.
ProcessWaitClose 暂停脚本的执行直至给定进程不再存在为止.
然后再执行你对注册表的操作。
Global $pid = "PC", $pidexist = False
;等待进程运行
While 1
For $i = 2 To 254
If ProcessExists($pid & $i) Then
$pid = $pid & $i
$pidexist = True
EndIf
Next
If $pidexist Then ExitLoop
Sleep(3000)
WEnd
;等待进程结束
While ProcessExists($pid) <> 0
Sleep(3000)
WEnd
;可以导入注册表了
...
Exit
For $i = 2 To 254 ;如果机器编号是2位数,改下 这行为 For $i = 10 To 99
If ProcessExists($pid & $i) Then
$pid = $pid & $i
$pidexist = True
ExitLoop
EndIf
Next
while 1
do
until processexists
wend
yhxhappy 发表于 2010-12-15 08:35 http://www.autoitx.com/images/common/back.gif
测试了一下这段代码,效果不错,但是能不能加一个等待超时? 我测试的时候是脚本开始,一直在等待pc*.exe进程,如果pc*.exe进程不在就一直等待,直到该进程出现为止。希望能加一个等待时间,比如说等待10秒,或者是20秒超时后, 继续执行。 AA()
;其它代码
Func AA()
Local $Time = 10 ;预设等待 10 秒
While 1
If $Time <= 0 Then Return ;时间到则退出
$list = ProcessList()
For $i = 1 to $list
If StringInStr($list[$i],"PC") Then ;如果判断进程存在则开始循环等待进程结束
While 1
If ProcessExists($list[$i]) = 0 Then ;如果监控的进程已不存在,则开始写入注册表
;写注册表代码
Return
EndIf
WEnd
EndIf
Next
Sleep(1000)
ToolTip($Time)
$Time -= 1
WEnd
EndFunc 回复 11# xiaogou5852
这样啊
直接延时就可以
Sleep(11000) ;进入程序等待 11秒
If ProcessExists(@ComputerName&".exe") Then Sleep(11000) ;11秒后如果有进程则还等待 11秒,没有执行下一步
If ProcessExists(@ComputerName&".exe") Then ProcessClose(@ComputerName&".exe") ;如果11秒后还占位,就强制结束
;写注册表
RegWrite()
本帖最后由 xiaogou5852 于 2010-12-16 19:37 编辑
回复 12# yhxhappy
测试了下这个脚本,是等待10秒,没出现pc*.exe进程就退出脚本。
我的意思是,在原来6楼您发的那段代码里,加上等待10秒,或20秒,没出现进程同样执行导注册表操作。然后退出。原来是,进程没出现就一直等待
If StringInStr($list[$i],"PC") Then ;如果判断进程存在则开始循环等待进程结束
While 1
If ProcessExists($list[$i]) = 0 Then ;如果监控的进程已不存在,则开始写入注册表
;写注册表代码
Exit
EndIf
Sleep(1)
WEnd
EndIf
这里面我试了很多次,都不知道应该怎样写,等待10秒,或20秒后,不出现pc*.exe 也写注册表,然后退出。 回复 AA()
;其它代码
Func AA()
Local $Time = 10 ;预设等待 10 秒
While 1
If $Time <= 0 Then ;时间到但进程还不出现,则写注册表,并退出
;写注册表代码
Return
Endif
$list = ProcessList()
For $i = 1 to $list
If StringInStr($list[$i],"PC") Then ;如果判断进程存在则开始循环等待进程结束
While 1
If ProcessExists($list[$i]) = 0 Then ;如果监控的进程已不存在,则开始写入注册表
;写注册表代码
Return
EndIf
WEnd
EndIf
Next
Sleep(1000)
ToolTip($Time)
$Time -= 1
WEnd
EndFunc44&ptid=20425]14# xiaogou5852
页:
[1]
2