藤真 发表于 2012-5-4 10:55:12

求助,这个条件选择结构为什么只运行两次就自动退出了?

本帖最后由 藤真 于 2012-5-4 11:44 编辑

;~ 2.判断是否存在进程QQ.exe,alg.exe,explorer.exe,存在则显示名字和pid,全部不存在则显示"不存在检测的进程"(使用select或switch)

Dim $a="qq.exe"
Dim $b="alg.exe"
Dim $c="explorer.exe"

Select
        Case ProcessExists($a)=0
                MsgBox(64,"进程检测",$a&"进程不存在")
        Case ProcessExists($a)<>0
                MsgBox(64,"进程检测",$a&"进程存在,其pid为:"&ProcessExists($a))
                ContinueCase
        Case ProcessExists($b)=0
                MsgBox(64,"进程检测",$b&"进程不存在")
        Case ProcessExists($b)<>0
                MsgBox(64,"进程检测",$b&"进程存在,其pid为:"&ProcessExists($b))
                ContinueCase
        Case ProcessExists($c)=0
                MsgBox(64,"进程检测",$c&"进程不存在")
        Case ProcessExists($c)<>0
                MsgBox(64,"进程检测",$c&"进程存在,其pid为:"&ProcessExists($c))
                ContinueCase
        Case Else
                MsgBox(64,"进程检测","不存在检测的进程")
                ContinueCase
EndSelect

只能检测到QQ和ALG进程,然后就退出了。

user3000 发表于 2012-5-4 11:20:24

回复 1# 藤真

首先, 要澄清你的错误概念, Select ... EndSelect 不是循环语句, 是判断语句!
其次, 按你的判断结果, 它们应该要独立的单独进行判断!
比如这样:Dim $a = "qq.exe"
Dim $b = "alg.exe"
Dim $c = "explorer.exe"

If ProcessExists($a) = 0 Then
        MsgBox(64, "进程检测", $a & "进程不存在")
Else
        MsgBox(64, "进程检测", $a & "进程存在,其pid为:" & ProcessExists($a))
EndIf

If ProcessExists($b) = 0 Then
        MsgBox(64, "进程检测", $b & "进程不存在")
Else
        MsgBox(64, "进程检测", $b & "进程存在,其pid为:" & ProcessExists($b))
EndIf

If ProcessExists($c) = 0 Then
        MsgBox(64, "进程检测", $c & "进程不存在")
Else
        MsgBox(64, "进程检测", $c & "进程存在,其pid为:" & ProcessExists($c))
EndIf

502762378 发表于 2012-5-4 11:21:29

我乐了,select这个是循环语句吗?请看帮助文档。

藤真 发表于 2012-5-4 11:43:19

回复 2# user3000

谢谢你的回答,我是新手呵呵。。

但是根据题目要求,这里必须要使用select或者switch语句来完成,主要是为了熟练这个语句,请问如何完成这个练习呢?

2.判断是否存在进程QQ.exe,alg.exe,explorer.exe,存在则显示名字和pid,全部不存在则显示"不存在检测的进程"(使用select或switch)

藤真 发表于 2012-5-4 11:45:28

我后来想了一下,因为alg.exe这个进程不存在,所以判断结果为假,所以程序就直接退出了,不知道我想的是不是对的?哪位大牛帮我完成上面的题目,需要使用select或者是switch语句来完成。

凌九霄 发表于 2012-5-4 12:05:56

外面加个for循环然后switch判断

user3000 发表于 2012-5-4 12:13:04

回复 4# 藤真

你觉得 "每一个进程的存在与否" 跟 "另外的进程的存在与否" 之间有什么逻辑关系吗?
没有吧! 那么你为什么非得硬把它们拉在一起?

就是用 Select 语句, 也得用三个 Select 语句. 不然, 用 ContinueCase 硬把它们凑一起, 永远得不到正确的结果.

shqf 发表于 2012-5-4 13:40:00

本帖最后由 shqf 于 2012-5-4 13:46 编辑

楼主没有仔细看帮助啊,select语句块中“如果表达式(第一个)为真则执行从下一行开始一直到下一个 Case 或 EndSelect 为止的所有语句.如果有多个Case表达式都成立则只执行第一个Case语句.”,注意这里只执行第一个条件成立的case语句啊,而不管下面是否还有成立的case语句,select语句就执行结束了。
首先select它不是循环语句,其次它的条件判断不同于if语句。照楼主的思路应该用if语句,象2 楼那样。一定要用select,则根据其特点,应使用嵌套:Dim $c = "qq.exe"
Dim $b = "alg.exe"
Dim $a = "explorer.exe"

Select
        Case ProcessExists($a) = 0
                MsgBox(64, "进程检测", $a & "进程不存在")
        Case ProcessExists($a) <> 0
                MsgBox(64, "进程检测", $a & "进程存在,其pid为:" & ProcessExists($a))               
        Select
                Case ProcessExists($b) = 0
                                MsgBox(64, "进程检测", $b & "进程不存在")
                Case ProcessExists($b) <> 0
                        MsgBox(64, "进程检测", $b & "进程存在,其pid为:" & ProcessExists($b))                               
                Select
                        Case ProcessExists($c) = 0
                                MsgBox(64, "进程检测", $c & "进程不存在")
                        Case ProcessExists($c) <> 0
                                MsgBox(64, "进程检测", $c & "进程存在,其pid为:" & ProcessExists($c))
                EndSelect
        EndSelect               
EndSelect但根据4楼的题目要求,某个进程不存在不用显示的,但全部不存在时要显示出来,代码应如下:Dim $c = "qq.exe"
Dim $b = "alg.exe"
Dim $a = "explorer.exe"
Local $flag = 0

Select
        Case ProcessExists($a) <> 0
                MsgBox(64, "进程检测", $a & "进程存在,其pid为:" & ProcessExists($a))       
                $flag=1
        Select
                Case ProcessExists($b) <> 0
                        MsgBox(64, "进程检测", $b & "进程存在,其pid为:" & ProcessExists($b))       
                        $flag = 1
                Select
                        Case ProcessExists($c) <> 0
                                MsgBox(64, "进程检测", $c & "进程存在,其pid为:" & ProcessExists($c))
                                $flag = 1       
                EndSelect
        EndSelect               
EndSelect
If $flag = 0 Then MsgBox(64, "进程检测","三个进程都不存在")

502762378 发表于 2012-5-4 14:17:35

回复 1# 藤真


    你每个case判断后的对话框后都加一个ContinueCase试试,这样一想不也是循环判断吗?,是我没细看,既然是练习,多看看帮助文档呀

netegg 发表于 2012-5-4 14:55:48

本帖最后由 netegg 于 2012-5-4 14:57 编辑

回复 2# user3000

这是谁告诉你的,continuecase就是继续执行判断用的,不会判断成立就退出判断

不过楼主如果需要判断,那么最好在最后的一个case前面所有的case中都加上continuecase

netegg 发表于 2012-5-4 14:59:27

回复 8# shqf

select可以嵌套使用的?这个倒是没注意过,程序是如何判断内部select里的case到底跟的是哪个select的?

user3000 发表于 2012-5-4 15:19:19

本帖最后由 user3000 于 2012-5-5 16:16 编辑

此楼发言有错误,特此编辑删除掉!
已在 15楼 举例说明 ContinueCase 的用途.

17楼 蛋大 更放上来自 官方的英文讲解!

请参阅!

netegg 发表于 2012-5-4 15:24:33

本帖最后由 netegg 于 2012-5-4 15:25 编辑

回复 12# user3000

又想了想,不是这个问题,select是单一变量的判断,只切换相同变量的值,切换变量是不管用的

1007236046 发表于 2012-5-4 15:31:50

Dim $a = "qq.exe"
Dim $b = "alg.exe"
Dim $c = "explorer.exe"
Dim $check =
Select
        Case $check Or $check Or $check
                For $i = 0 To 2
                        If $check[$i] Then MsgBox(0,"进程检测",$check[$i])
                Next
        Case Else
                MsgBox(0,"进程检测","不存在检测的进程")
EndSelect
可以检测pid的

user3000 发表于 2012-5-4 15:55:45

本帖最后由 user3000 于 2012-5-5 08:05 编辑

回复 13# netegg
我12楼测试结果还是有错误, 复制楼主代码后, 第1条Case里没加 ContinueCase
Au3 中的 Select 判断加入 ContinueCase 的作用是:
当出现 CASE 真判断, 其跟有 ContinueCase 的, 下一条的 Case 语句 无论真假 肯定, 必定, 绝对会 执行!
如果接着还有 ContinueCase 关键词, 则下下条Case 语句 无论真假也是 肯定, 必定, 绝对会 执行! 一路执行下去, 直到遇到没有 ContinueCase 的 Case 行为止!
大家测试下面代码就知道了.
Dim $a = "explorer.exe"
Dim $aa = ProcessExists($a)
MsgBox(0, '开始第1次测试', '第一个判断为真, 有5条信息!')
Select
        Case $aa <> 0
                MsgBox(64, '判断1-1', $a & "进程存在,其pid为:" & $aa)
                ContinueCase
        Case $aa = 0
                MsgBox(64, '判断1-2', $a & "进程不存在")
                ContinueCase
        Case $aa = 1000
                MsgBox(64, '判断1-3', $a & "进程存在")
                ContinueCase
        Case $aa = 220
                MsgBox(64, '判断1-4', $a & "进程存在")
                ContinueCase
        Case Else
                MsgBox(64, '判断1-5', "不存在检测的进程")
EndSelect

MsgBox(0, '开始第2次测试', '将刚才为真的判断移动到倒数第2的位置' & @CRLF & '结果显示2条信息!', 2)
Select
        Case $aa = 0
                MsgBox(64, '判断2-1', $a & "进程不存在")
                ContinueCase
        Case $aa = 1000
                MsgBox(64, '判断2-2', $a & "进程存在")
                ContinueCase
        Case $aa = 220
                MsgBox(64, '判断2-3', $a & "进程存在")
                ContinueCase
        Case $aa <> 0
                MsgBox(64, '判断2-4', $a & "进程存在,其pid为:" & $aa)
                ContinueCase
        Case Else
                MsgBox(64, '判断2-5', "不存在检测的进程")
EndSelect

MsgBox(0, '测试信息', '将刚才为真的判断移动到倒数第3的位置' & @CRLF & '结果显示3条信息!', 2)
Select
        Case $aa = 0
                MsgBox(64, '判断3-1', $a & "进程不存在")
                ContinueCase
        Case $aa = 1000
                MsgBox(64, '判断3-2', $a & "进程存在")
                ContinueCase
        Case $aa <> 0
                MsgBox(64, '判断3-3', $a & "进程存在,其pid为:" & $aa)
                ContinueCase
        Case $aa = 220
                MsgBox(64, '判断3-4', $a & "进程存在")
                ContinueCase
        Case Else
                MsgBox(64, '判断3-5', "不存在检测的进程")
EndSelect
页: [1] 2
查看完整版本: 求助,这个条件选择结构为什么只运行两次就自动退出了?