找回密码
 加入
搜索
查看: 4539|回复: 12

[AU3基础] [已解决]请教AU3能否进行服务搜索?

  [复制链接]
发表于 2014-2-4 14:32:24 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2014-2-9 18:13 编辑

有一个服务,服务名是AB,其中,其中A是固定的,而B是不固定的,能否根据固定的部分,搜索出它的全名?谢谢!
发表于 2014-2-9 14:04:56 | 显示全部楼层
#Include <Services.au3>
_Service_Enum
 楼主| 发表于 2014-2-9 18:12:25 | 显示全部楼层
回复 2# netegg


Local $Serviceslist 
$Serviceslist = _ServListInstalled()
_ArrayDisplay($Serviceslist, "")

Func _ServListInstalled($Computer = ".")
    Local $Rtn = ''
    Local $Service = ObjGet("winmgmts:\\" & $Computer & "\root\cimv2")
    Local $sItems = $Service.ExecQuery("Select * from Win32_Service")
    For $objService In $sItems
        $Rtn &= $objService.Name & '|'
    Next
    Return StringSplit(StringTrimRight($Rtn, 1), '|')
EndFunc   ;==>_ServListInstalled

Func _ArrayDisplay(Const ByRef $avArray, $sTitle = "Array: 列表视图(ListView)显示", $iItemLimit = -1, $iTranspose = 0, $sSeparator = "", $sReplace = "|", $sHeader = "")
        If Not IsArray($avArray) Then Return SetError(1, 0, 0)
        ; Dimension checking
        Local $iDimension = UBound($avArray, 0), $iUBound = UBound($avArray, 1) - 1, $iSubMax = UBound($avArray, 2) - 1
        If $iDimension > 2 Then Return SetError(2, 0, 0)

        ; Separator handling
;~     If $sSeparator = "" Then $sSeparator = Chr(1)
        If $sSeparator = "" Then $sSeparator = Chr(124)

        ;  Check the separator to make sure it's not used literally in the array
        If _ArraySearch($avArray, $sSeparator, 0, 0, 0, 1) <> -1 Then
                For $x = 1 To 255
                        If $x >= 32 And $x <= 127 Then ContinueLoop
                        Local $sFind = _ArraySearch($avArray, Chr($x), 0, 0, 0, 1)
                        If $sFind = -1 Then
                                $sSeparator = Chr($x)
                                ExitLoop
                        EndIf
                Next
        EndIf

        ; Declare variables
        Local $vTmp, $iBuffer = 64
        Local $iColLimit = 250
        Local $iOnEventMode = Opt("GUIOnEventMode", 0), $sDataSeparatorChar = Opt("GUIDataSeparatorChar", $sSeparator)

        ; Swap dimensions if transposing
        If $iSubMax < 0 Then $iSubMax = 0
        If $iTranspose Then
                $vTmp = $iUBound
                $iUBound = $iSubMax
                $iSubMax = $vTmp
        EndIf

        ; Set limits for dimensions
        If $iSubMax > $iColLimit Then $iSubMax = $iColLimit
        If $iItemLimit < 1 Then $iItemLimit = $iUBound
        If $iUBound > $iItemLimit Then $iUBound = $iItemLimit

        ; Set header up
        If $sHeader = "" Then
                $sHeader = "Row  "        ; blanks added to adjust column size for big number of rows
                For $i = 0 To $iSubMax
                        $sHeader &= $sSeparator & "Col " & $i
                Next
        EndIf

        ; Convert array into text for listview
        Local $avArrayText[$iUBound + 1]
        For $i = 0 To $iUBound
                $avArrayText[$i] = "[" & $i & "]"
                For $j = 0 To $iSubMax
                        ; Get current item
                        If $iDimension = 1 Then
                                If $iTranspose Then
                                        $vTmp = $avArray[$j]
                                Else
                                        $vTmp = $avArray[$i]
                                EndIf
                        Else
                                If $iTranspose Then
                                        $vTmp = $avArray[$j][$i]
                                Else
                                        $vTmp = $avArray[$i][$j]
                                EndIf
                        EndIf

                        ; Add to text array
                        $vTmp = StringReplace($vTmp, $sSeparator, $sReplace, 0, 1)
                        $avArrayText[$i] &= $sSeparator & $vTmp

                        ; Set max buffer size
                        $vTmp = StringLen($vTmp)
                        If $vTmp > $iBuffer Then $iBuffer = $vTmp
                Next
        Next
        $iBuffer += 1

        ; GUI Constants
        Local Const $_ARRAYCONSTANT_GUI_DOCKBORDERS = 0x66
        Local Const $_ARRAYCONSTANT_GUI_DOCKBOTTOM = 0x40
        Local Const $_ARRAYCONSTANT_GUI_DOCKHEIGHT = 0x0200
        Local Const $_ARRAYCONSTANT_GUI_DOCKLEFT = 0x2
        Local Const $_ARRAYCONSTANT_GUI_DOCKRIGHT = 0x4
        Local Const $_ARRAYCONSTANT_GUI_EVENT_CLOSE = -3
        Local Const $_ARRAYCONSTANT_LVIF_PARAM = 0x4
        Local Const $_ARRAYCONSTANT_LVIF_TEXT = 0x1
        Local Const $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH = (0x1000 + 29)
        Local Const $_ARRAYCONSTANT_LVM_GETITEMCOUNT = (0x1000 + 4)
        Local Const $_ARRAYCONSTANT_LVM_GETITEMSTATE = (0x1000 + 44)
        Local Const $_ARRAYCONSTANT_LVM_INSERTITEMW = (0x1000 + 77)
        Local Const $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE = (0x1000 + 54)
        Local Const $_ARRAYCONSTANT_LVM_SETITEMW = (0x1000 + 76)
        Local Const $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT = 0x20
        Local Const $_ARRAYCONSTANT_LVS_EX_GRIDLINES = 0x1
        Local Const $_ARRAYCONSTANT_LVS_SHOWSELALWAYS = 0x8
        Local Const $_ARRAYCONSTANT_WS_EX_CLIENTEDGE = 0x0200
        Local Const $_ARRAYCONSTANT_WS_MAXIMIZEBOX = 0x00010000
        Local Const $_ARRAYCONSTANT_WS_MINIMIZEBOX = 0x00020000
        Local Const $_ARRAYCONSTANT_WS_SIZEBOX = 0x00040000
        Local Const $_ARRAYCONSTANT_tagLVITEM = "int Mask;int Item;int SubItem;int State;int StateMask;ptr Text;int TextMax;int Image;int Param;int Indent;int GroupID;int Columns;ptr pColumns"

        Local $iAddMask = BitOR($_ARRAYCONSTANT_LVIF_TEXT, $_ARRAYCONSTANT_LVIF_PARAM)
        Local $tBuffer = DllStructCreate("wchar Text[" & $iBuffer & "]"), $pBuffer = DllStructGetPtr($tBuffer)
        Local $tItem = DllStructCreate($_ARRAYCONSTANT_tagLVITEM), $pItem = DllStructGetPtr($tItem)
        DllStructSetData($tItem, "Param", 0)
        DllStructSetData($tItem, "Text", $pBuffer)
        DllStructSetData($tItem, "TextMax", $iBuffer)

        ; Set interface up
        Local $iWidth = 640, $iHeight = 480
        Local $hGUI = GUICreate($sTitle, $iWidth, $iHeight, Default, Default, BitOR($_ARRAYCONSTANT_WS_SIZEBOX, $_ARRAYCONSTANT_WS_MINIMIZEBOX, $_ARRAYCONSTANT_WS_MAXIMIZEBOX))
        Local $aiGUISize = WinGetClientSize($hGUI)
        Local $hListView = GUICtrlCreateListView($sHeader, 0, 0, $aiGUISize[0], $aiGUISize[1] - 26, $_ARRAYCONSTANT_LVS_SHOWSELALWAYS)
        Local $hCopy = GUICtrlCreateButton("复制所选", 3, $aiGUISize[1] - 23, $aiGUISize[0] - 6, 20)
        GUICtrlSetResizing($hListView, $_ARRAYCONSTANT_GUI_DOCKBORDERS)
        GUICtrlSetResizing($hCopy, $_ARRAYCONSTANT_GUI_DOCKLEFT + $_ARRAYCONSTANT_GUI_DOCKRIGHT + $_ARRAYCONSTANT_GUI_DOCKBOTTOM + $_ARRAYCONSTANT_GUI_DOCKHEIGHT)
        GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_GRIDLINES, $_ARRAYCONSTANT_LVS_EX_GRIDLINES)
        GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT, $_ARRAYCONSTANT_LVS_EX_FULLROWSELECT)
        GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETEXTENDEDLISTVIEWSTYLE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE, $_ARRAYCONSTANT_WS_EX_CLIENTEDGE)

        ; Fill listview
        Local $aItem
        For $i = 0 To $iUBound
                If GUICtrlCreateListViewItem($avArrayText[$i], $hListView) = 0 Then
                        ; use GUICtrlSendMsg() to overcome AutoIt limitation
                        $aItem = StringSplit($avArrayText[$i], $sSeparator)
                        DllStructSetData($tBuffer, "Text", $aItem[1])

                        ; Add listview item
                        DllStructSetData($tItem, "Item", $i)
                        DllStructSetData($tItem, "SubItem", 0)
                        DllStructSetData($tItem, "Mask", $iAddMask)
                        GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_INSERTITEMW, 0, $pItem)

                        ; Set listview subitem text
                        DllStructSetData($tItem, "Mask", $_ARRAYCONSTANT_LVIF_TEXT)
                        For $j = 2 To $aItem[0]
                                DllStructSetData($tBuffer, "Text", $aItem[$j])
                                DllStructSetData($tItem, "SubItem", $j - 1)
                                GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_SETITEMW, 0, $pItem)
                        Next
                EndIf
        Next

        ; adjust window width
        $iWidth = 0
        For $i = 0 To $iSubMax + 1
                $iWidth += GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETCOLUMNWIDTH, $i, 0)
        Next
        If $iWidth < 250 Then $iWidth = 230
        $iWidth += 20

        If $iWidth > @DesktopWidth Then $iWidth = @DesktopWidth - 100

        WinMove($hGUI, "", (@DesktopWidth - $iWidth)/2, Default, $iWidth)

        ; Show dialog
        GUISetState(@SW_SHOW, $hGUI)

        While 1
                Switch GUIGetMsg()
                        Case $_ARRAYCONSTANT_GUI_EVENT_CLOSE
                                ExitLoop

                        Case $hCopy
                                Local $sClip = ""

                                ; Get selected indices [ _GUICtrlListView_GetSelectedIndices($hListView, True) ]
                                Local $aiCurItems[1] = [0]
                                For $i = 0 To GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMCOUNT, 0, 0)
                                        If GUICtrlSendMsg($hListView, $_ARRAYCONSTANT_LVM_GETITEMSTATE, $i, 0x2) Then
                                                $aiCurItems[0] += 1
                                                ReDim $aiCurItems[$aiCurItems[0] + 1]
                                                $aiCurItems[$aiCurItems[0]] = $i
                                        EndIf
                                Next

                                ; Generate clipboard text
                                If Not $aiCurItems[0] Then
                                        For $sItem In $avArrayText
                                                $sClip &= $sItem & @CRLF
                                        Next
                                Else
                                        For $i = 1 To UBound($aiCurItems) - 1
                                                $sClip &= $avArrayText[$aiCurItems[$i]] & @CRLF
                                        Next
                                EndIf
                                ClipPut($sClip)
                EndSwitch
        WEnd
        GUIDelete($hGUI)

        Opt("GUIOnEventMode", $iOnEventMode)
        Opt("GUIDataSeparatorChar", $sDataSeparatorChar)

        Return 1
EndFunc   ;==>_ArrayDisplay

Func _ArraySearch(Const ByRef $avArray, $vValue, $iStart = 0, $iEnd = 0, $iCase = 0, $iPartial = 0, $iForward = 1, $iSubItem = -1)
        If Not IsArray($avArray) Then Return SetError(1, 0, -1)
        If UBound($avArray, 0) > 2 Or UBound($avArray, 0) < 1 Then Return SetError(2, 0, -1)

        Local $iUBound = UBound($avArray) - 1

        ; Bounds checking
        If $iEnd < 1 Or $iEnd > $iUBound Then $iEnd = $iUBound
        If $iStart < 0 Then $iStart = 0
        If $iStart > $iEnd Then Return SetError(4, 0, -1)

        ; Direction (flip if $iForward = 0)
        Local $iStep = 1
        If Not $iForward Then
                Local $iTmp = $iStart
                $iStart = $iEnd
                $iEnd = $iTmp
                $iStep = -1
        EndIf

        ; Search
        Switch UBound($avArray, 0)
                Case 1 ; 1D array search
                        If Not $iPartial Then
                                If Not $iCase Then
                                        For $i = $iStart To $iEnd Step $iStep
                                                If $avArray[$i] = $vValue Then Return $i
                                        Next
                                Else
                                        For $i = $iStart To $iEnd Step $iStep
                                                If $avArray[$i] == $vValue Then Return $i
                                        Next
                                EndIf
                        Else
                                For $i = $iStart To $iEnd Step $iStep
                                        If StringInStr($avArray[$i], $vValue, $iCase) > 0 Then Return $i
                                Next
                        EndIf
                Case 2 ; 2D array search
                        Local $iUBoundSub = UBound($avArray, 2) - 1
                        If $iSubItem > $iUBoundSub Then $iSubItem = $iUBoundSub
                        If $iSubItem < 0 Then
                                ; will search for all Col
                                $iSubItem = 0
                        Else
                                $iUBoundSub = $iSubItem
                        EndIf

                        For $j = $iSubItem To $iUBoundSub
                                If Not $iPartial Then
                                        If Not $iCase Then
                                                For $i = $iStart To $iEnd Step $iStep
                                                        If $avArray[$i][$j] = $vValue Then Return $i
                                                Next
                                        Else
                                                For $i = $iStart To $iEnd Step $iStep
                                                        If $avArray[$i][$j] == $vValue Then Return $i
                                                Next
                                        EndIf
                                Else
                                        For $i = $iStart To $iEnd Step $iStep
                                                If StringInStr($avArray[$i][$j], $vValue, $iCase) > 0 Then Return $i
                                        Next
                                EndIf
                        Next
                Case Else
                        Return SetError(7, 0, -1)
        EndSwitch

        Return SetError(6, 0, -1)
EndFunc   ;==>_ArraySearch
发表于 2014-2-9 19:37:21 | 显示全部楼层
真够累的,五行的事要写出这么多
 楼主| 发表于 2014-2-9 20:01:57 | 显示全部楼层
回复 4# netegg

这是根源,你不觉得老插入头文件很不爽吗?
发表于 2014-2-9 20:46:25 | 显示全部楼层
回复 5# smooth
说实话还真没觉得,编辑的时候只要思路清晰就行了,编译的时候再考虑精简的事情,而且可以由编译器自己做,何必在写的时候累自己呢
 楼主| 发表于 2014-2-10 00:12:15 | 显示全部楼层
回复 6# netegg

编译器能自动的把需要的函数插入脚本?这个我还真的不知道。
发表于 2014-2-10 00:43:05 | 显示全部楼层
Alt+f6或者工具里的精简代码
 楼主| 发表于 2014-2-10 16:24:55 | 显示全部楼层
回复 8# netegg

蛋蛋就是蛋蛋,果然厉害啊,这个功能我从来就没有关注过,又学习了一招。
发表于 2014-2-11 17:12:20 | 显示全部楼层
本帖最后由 虫子樱桃 于 2014-2-11 17:19 编辑

其实WMI可以使用常用的SQL语句进行过滤和筛选,下楼我会给一个完整的例子。
发表于 2014-2-11 17:12:32 | 显示全部楼层
本帖最后由 虫子樱桃 于 2014-2-11 17:17 编辑
Select * from Win32_Service where xxx like 'A%'
即可模糊匹配
参考下面的代码
; 生成于 AutoIt Scriptomatic

__wmi_Win32_Service()
Func __wmi_Win32_Service()
        Local $wbemFlagReturnImmediately = 0x10
        Local $wbemFlagForwardOnly = 0x20
        Local $colItems = ""
        Local $strComputer = "localhost"

        Local $Output=""
        $Output &= "Computer: " & $strComputer  & @CRLF
        $Output &= "==========================================" & @CRLF
        Local $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
        $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_Service Where Caption Like 'Application%'", "WQL", _
                                          $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

        If IsObj($colItems) then
           For $objItem In $colItems
              $Output &= "AcceptPause: " & $objItem.AcceptPause & @CRLF
              $Output &= "AcceptStop: " & $objItem.AcceptStop & @CRLF
              $Output &= "Caption: " & $objItem.Caption & @CRLF
              $Output &= "CheckPoint: " & $objItem.CheckPoint & @CRLF
              $Output &= "CreationClassName: " & $objItem.CreationClassName & @CRLF
              $Output &= "Description: " & $objItem.Description & @CRLF
              $Output &= "DesktopInteract: " & $objItem.DesktopInteract & @CRLF
              $Output &= "DisplayName: " & $objItem.DisplayName & @CRLF
              $Output &= "ErrorControl: " & $objItem.ErrorControl & @CRLF
              $Output &= "ExitCode: " & $objItem.ExitCode & @CRLF
              $Output &= "InstallDate: " & WMIDateStringToDate($objItem.InstallDate) & @CRLF
              $Output &= "Name: " & $objItem.Name & @CRLF
              $Output &= "PathName: " & $objItem.PathName & @CRLF
              $Output &= "ProcessId: " & $objItem.ProcessId & @CRLF
              $Output &= "ServiceSpecificExitCode: " & $objItem.ServiceSpecificExitCode & @CRLF
              $Output &= "ServiceType: " & $objItem.ServiceType & @CRLF
              $Output &= "Started: " & $objItem.Started & @CRLF
              $Output &= "StartMode: " & $objItem.StartMode & @CRLF
              $Output &= "StartName: " & $objItem.StartName & @CRLF
              $Output &= "State: " & $objItem.State & @CRLF
              $Output &= "Status: " & $objItem.Status & @CRLF
              $Output &= "SystemCreationClassName: " & $objItem.SystemCreationClassName & @CRLF
              $Output &= "SystemName: " & $objItem.SystemName & @CRLF
              $Output &= "TagId: " & $objItem.TagId & @CRLF
              $Output &= "WaitHint: " & $objItem.WaitHint & @CRLF
              if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
              $Output=""
           Next
        Else
           Msgbox(0,"WMI 输出","没有在类 " & "Win32_Service" & "中找到WMI对象" )
        Endif
EndFunc


Func WMIDateStringToDate($dtmDate)

        Return (StringMid($dtmDate, 5, 2) & "/" & _
        StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
        & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
EndFunc
发表于 2014-2-11 23:21:03 | 显示全部楼层
回复 11# 虫子樱桃
如果关了wmi服务还能出来吗
发表于 2014-2-12 08:36:48 | 显示全部楼层
回复 12# netegg


    这个肯定不行呀
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-9-28 13:25 , Processed in 0.083748 second(s), 19 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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