1

Тема: VBS: Sub

Укажите на ошибку пожалуйста.
Пытаюсь получить ss из sub
если проверяемого процесса нет он выдает пустое сообщение, если процесс есть он вообще ничего не выдает без sub работает нормально.


' окно процесса
sub a ()
  Set WshShell = WScript.CreateObject("WScript.Shell")

  if Instr(1, WScript.FullName, "WScript.exe", 1) > 0 Then
     WshShell.Run "CScript """ & WScript.ScriptFullName & """", 0
     Set WshShell = Nothing
     WScript.Quit 1
  End if

  strComputer = "."

  Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" _ 
      & strComputer & "\root\cimv2") 

  Set colProcess = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Process" & " WHERE Name = 'calc.exe'")

  Set Stream   = CreateObject("ADODB.Stream")

  For Each objProcess in colProcess
      Set WshExec = WshShell.Exec("cmd")
      With WshExec.StdIn
           .WriteLine "tasklist /FI ""IMAGENAME eq " + objProcess.Name + """ /V /FO ""LIST"""
           .WriteLine "exit"
      End With

        Do While Not wshExec.StdOut.AtEndOfStream
                wshExecLine = wshExec.StdOut.ReadLine()

               If (InStr(wshExecLine, StrConv("Заголовок","cp866","Windows-1251"))) Then  
                    ss = Right( wshExecLine ,Len(wshExecLine)-15)  
                
                End If
                
            Loop

    '  ss = WshExec.StdOut.Readall
          'ss = Split(ss,":")
         
      ss = StrConv(ss, "Windows-1251", "cp866")
ss = Len(ss)
        Next
        
END sub

 
MsgBox  a


    'loop until ss =18
    
 
'if ss = 18 then
'msgbox "1"
'else
'msgbox "2"
'end if

  'WScript.Quit 0


' конвертация из DOS в WINDOWS
Function StrConv(Text, SourceCharset, DestCharset)
    Stream.Type = 2
    Stream.Mode = 3
    Stream.Open
    Stream.Charset = SourceCharset
    Stream.WriteText Text
    Stream.Position = 0
    Stream.Charset = DestCharset
    StrConv = Stream.ReadText
    Stream.Close
End Function

2

Re: VBS: Sub

Sub это подпроцедура. Она может возвращать значения только через параметры переданные по ссылке либо в результате присвоения глобально доступных переменных.



MsgBox a

Sub Test(a)
   a  = 1
End Sub

В Вашем случае, имеет смысл использовать Function и возвращать значение штатным образом через имя функции:


MsgBox Test
Function Test()
   Test = 1
End Function

Подробнее о принципах работы процедур Visual Basic:
http://msdn.microsoft.com/en-us/library … s.84).aspx
и функций
http://msdn.microsoft.com/en-us/library … s.84).aspx


http://www.w3schools.com/vbscript/vbscr … edures.asp

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

3 (изменено: therb, 2014-06-19 15:10:56)

Re: VBS: Sub

А не подскажете как мне передать функцию внутрь функции?
в таком варианте когда процесс запущен он вообще не открывает меседжбокс, а если не запущен выдает пустой  меседжбокс.

' окно процесса
msgbox a
function a()
  Set WshShell = WScript.CreateObject("WScript.Shell")

  if Instr(1, WScript.FullName, "WScript.exe", 1) > 0 Then
     WshShell.Run "CScript """ & WScript.ScriptFullName & """", 0
     Set WshShell = Nothing
     WScript.Quit 1
  End if

  strComputer = "."

  Set objWMIService = GetObject("winmgmts:" _
      & "{impersonationLevel=impersonate}!\\" _ 
      & strComputer & "\root\cimv2") 

  Set colProcess = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Process" & " WHERE Name = 'calc.exe'")

  Set Stream   = CreateObject("ADODB.Stream")

  For Each objProcess in colProcess
      Set WshExec = WshShell.Exec("cmd")
      With WshExec.StdIn
           .WriteLine "tasklist /FI ""IMAGENAME eq " + objProcess.Name + """ /V /FO ""LIST"""
           .WriteLine "exit"
      End With

        Do While Not wshExec.StdOut.AtEndOfStream
                wshExecLine = wshExec.StdOut.ReadLine()

               If (InStr(wshExecLine, StrConv("Заголовок","cp866","Windows-1251"))) Then  
                    ss = Right( wshExecLine ,Len(wshExecLine)-15)  
                
                End If
                
            Loop

    '  ss = WshExec.StdOut.Readall
          'ss = Split(ss,":")
         
      ss = StrConv(ss, "Windows-1251", "cp866")

      
      Set WshExec = Nothing
  Next

 ' Set Stream   = Nothing
 ' Set WshShell = Nothing

 ' WScript.Quit 0
a = ss
end function
' конвертация из DOS в WINDOWS
Function StrConv(Text, SourceCharset, DestCharset)
    Stream.Type = 2
    Stream.Mode = 3
    Stream.Open
    Stream.Charset = SourceCharset
    Stream.WriteText Text
    Stream.Position = 0
    Stream.Charset = DestCharset
    StrConv = Stream.ReadText
    Stream.Close
End Function
msgbox  a