找回密码
 加入
搜索
查看: 7692|回复: 16

[系统综合] 【已解决】一个关于进程管理的问题

 火.. [复制链接]
发表于 2010-12-14 21:13:04 | 显示全部楼层 |阅读模式
本帖最后由 xiaogou5852 于 2010-12-17 21:05 编辑

我这是网吧的电脑,每次开机都有一个进程会往注册表里写东西。

不能阻止它往注册表写东西,不然会出错。

只能等它写完后,我在根据需要写入其他的注册表值。

但是那个进程不是一个固定的进程。  有的时候是 PC15.exe  有的时候是PC16.exe

唯一的相同点就是有2个PC 字符。

想请问各位大大,怎样判断这个 PC*.exe的进程是否存在?   等待PC*.exe 结束后写入一些值到注册表里?
发表于 2010-12-14 21:49:10 | 显示全部楼层
$list = ProcessList()
for $i = 1 to $list[0][0]
  If StringInStr($list[$i][0],"PC") Then 
  MsgBox(0,"进程存在","PID为: " & $list[$i][1])
  ExitLoop
  EndIf
next
 楼主| 发表于 2010-12-15 00:35:59 | 显示全部楼层
本帖最后由 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")
 楼主| 发表于 2010-12-15 00:38:42 | 显示全部楼层
本帖最后由 xiaogou5852 于 2010-12-15 00:42 编辑

我测试了好多次,都是我的脚本先运行,导入了注册表后 PC*.exe 才出现, 这样的话,PC*.exe 就会修改注册表,  所以我希望是等待pc*.exe 结束后在导入注册表。 我用Sleep来延迟脚本,有时可以有时不行, 所以还是希望能搞判断进程来导入。
发表于 2010-12-15 02:52:15 | 显示全部楼层
.........
换一个思路
例如你可以检测注册表是否已被写
While 1
$list = ProcessList()
for $i = 1 to $list[0][0]
  If StringInStr($list[$i][0],"PC") Then 
  MsgBox(0,"进程存在","PID为: " & $list[$i][1])
  ExitLoop (2)
  EndIf
next
Sleep(1)
WEnd
发表于 2010-12-15 08:35:06 | 显示全部楼层
While 1
        $list = ProcessList()
        For $i = 1 to $list[0][0]
                If StringInStr($list[$i][0],"PC") Then                                 ;如果判断进程存在则开始循环等待进程结束
                        While 1
                                If ProcessExists($list[$i][1]) = 0 Then                ;如果监控的进程已不存在,则开始写入注册表
                                        ;写注册表代码
                                        Exit
                                EndIf
                                Sleep(1)
                        WEnd
                EndIf
        Next
        Sleep(250)
WEnd
发表于 2010-12-15 10:27:58 | 显示全部楼层
我想每台机子上的PC某某是固定的吧, 这样你可以把它写入到一个配置文件中去
如果能确定你的脚本是这个进程之前启动的,那么就可以
ProcessWait  暂停脚本的执行直至给定进程出现为止.
ProcessWaitClose 暂停脚本的执行直至给定进程不再存在为止.
然后再执行你对注册表的操作。
发表于 2010-12-15 11:02:26 | 显示全部楼层
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
发表于 2010-12-15 11:12:48 | 显示全部楼层
For $i = 2 To 254 ;如果机器编号是2位数,改下 这行为 For $i = 10 To 99

        If ProcessExists($pid & $i) Then

                $pid = $pid & $i
                $pidexist = True
                ExitLoop
        EndIf

Next
发表于 2010-12-15 14:31:54 | 显示全部楼层
while 1
do
until processexists
wend
 楼主| 发表于 2010-12-16 13:08:40 | 显示全部楼层
yhxhappy 发表于 2010-12-15 08:35



    测试了一下这段代码,效果不错,但是能不能加一个等待超时? 我测试的时候是脚本开始,一直在等待pc*.exe进程,如果pc*.exe进程不在就一直等待,直到该进程出现为止。希望能加一个等待时间,比如说等待10秒,或者是20秒超时后, 继续执行。
发表于 2010-12-16 13:36:59 | 显示全部楼层
AA()
;其它代码

Func AA()
        Local $Time = 10                                                ;预设等待 10 秒
        While 1
                If $Time <= 0 Then Return                        ;时间到则退出
                $list = ProcessList()
                For $i = 1 to $list[0][0]
                        If StringInStr($list[$i][0],"PC") Then                                ;如果判断进程存在则开始循环等待进程结束
                                While 1
                                        If ProcessExists($list[$i][1]) = 0 Then                ;如果监控的进程已不存在,则开始写入注册表
                                                ;写注册表代码
                                                Return
                                        EndIf
                                WEnd
                        EndIf
                Next
                Sleep(1000)
                ToolTip($Time)
                $Time -= 1
        WEnd
EndFunc
发表于 2010-12-16 15:49:15 | 显示全部楼层
回复 11# xiaogou5852


这样啊
直接延时就可以
Sleep(11000) ;进入程序等待 11秒

If ProcessExists(@ComputerName&".exe") Then Sleep(11000) ;11秒后如果有进程则还等待 11秒,没有执行下一步

If ProcessExists(@ComputerName&".exe") Then ProcessClose(@ComputerName&".exe") ;如果11秒后还占位,就强制结束

;写注册表
RegWrite()
 楼主| 发表于 2010-12-16 19:32:52 | 显示全部楼层
本帖最后由 xiaogou5852 于 2010-12-16 19:37 编辑

回复 12# yhxhappy

测试了下这个脚本,是等待10秒,没出现pc*.exe进程就退出脚本。

我的意思是,在原来6楼您发的那段代码里,加上等待10秒,或20秒,没出现进程同样执行导注册表操作。然后退出。原来是,进程没出现就一直等待
               
                 If StringInStr($list[$i][0],"PC") Then                                 ;如果判断进程存在则开始循环等待进程结束
                        While 1
                                If ProcessExists($list[$i][1]) = 0 Then                ;如果监控的进程已不存在,则开始写入注册表
                                        ;写注册表代码
                                        Exit
                                EndIf
                                Sleep(1)
                        WEnd
                EndIf
这里面我试了很多次,都不知道应该怎样写,等待10秒,或20秒后,不出现pc*.exe 也写注册表,然后退出。
发表于 2010-12-16 19:46:13 | 显示全部楼层
回复 [url=http://www.autoitx.com/forum.php?mod=redirect&goto=findpost&pid=2451
AA()
;其它代码

Func AA()
        Local $Time = 10                                                ;预设等待 10 秒
        While 1
                If $Time <= 0 Then   ;时间到但进程还不出现,则写注册表,并退出
                     ;写注册表代码
                     Return                        
                Endif
                $list = ProcessList()
                For $i = 1 to $list[0][0]
                        If StringInStr($list[$i][0],"PC") Then                                ;如果判断进程存在则开始循环等待进程结束
                                While 1
                                        If ProcessExists($list[$i][1]) = 0 Then                ;如果监控的进程已不存在,则开始写入注册表
                                                ;写注册表代码
                                                Return
                                        EndIf
                                WEnd
                        EndIf
                Next
                Sleep(1000)
                ToolTip($Time)
                $Time -= 1
        WEnd
EndFunc
44&ptid=20425]14#[/url] xiaogou5852
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-26 20:16 , Processed in 0.088112 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表