2015-07-30 2 views
0

Немного задней землю:В ожидании процесса до конца, прежде чем активировать App

Я пытаюсь создать сценарий, который будет подписывать конкретный пользователь в программу в зависимости от времени суток. Каждый раз, когда неправильный человек подписывается в неправильные часы, у него есть потенциал, чтобы стоить компании 20 000 долларов в случае расходов на нарушение лицензии.

Я пробовал несколько вещей, самым простым из которых была электронная таблица, в которой использовались простые операторы if для определения регистрационных данных и открытия программы в оболочке. После заданного времени ожидания он будет вводить учетные данные. Это было проблематично из-за различных скоростей систем.

Я думал, что поеду в VBScript. Насколько это было иначе, чем VBA, я думал ... Ну, через пару дней я потерял.

Вот мой сценарий:

Sub QADHelper() 

'Logs the correct user into QAD depending on the time of day 

HourNow = Time 
Dim Shell, WMI, PID 
Set WSHShell = WScript.CreateObject("WScript.Shell") 
Set WMI = GetObject("winmgmts:!\\root\cimv2") 

'Note: Literal quotes are used because of the space between "program" and "files" 

WSHShell.Run """C:\Program Files\QAD\QAD Enterprise Applications 2007.1\QAD.Applications.exe""" 

PID = WaitforProcess("QAD.Applications.exe", 5) 

If PID >0 Then 
    Shell.AppActivate PID 
Else 
    WScript.Echo "Could not reach QAD" 
    WScript.Quit 1 
End If 


'This is where the QAD log in credentials are stored 

If HourNow >= "06:15:00" Then 
WSHShell.SendKeys "username1" 
WSHShell.SendKeys "{TAB}" 
WSHShell.SendKeys "password1" 
WSHShell.SendKeys "{ENTER}" 

ElseIf HourNow >= "14:15:01" Then 
WSHShell.SendKeys "username2" 
WSHShell.SendKeys "{TAB}" 
WSHShell.SendKeys "password2" 
WSHShell.SendKeys "{ENTER}" 

ElseIf HourNow >= "22:15:01" Then 
WSHShell.SendKeys "username3" 
WSHShell.SendKeys "{TAB}" 
WSHShell.SendKeys "password3" 
WSHShell.SendKeys "{ENTER}" 

Else 
    WScript.Echo "This isn't working properly" 
    WScript.Quit 1 
End If 

End Sub 

Function WaitForProcess(imageName, tries) 

    Dim wql, process 

    wql = "SELECT ProcessId FROM Win32_Process WHERE Name = '" & imageName & "'" 

    WaitForProcess = 0 

    While tries > 0 And WaitForProcess = 0 

     For Each process In WMI.ExecQuery(wql) 
      WaitForProcess = process.ProcessId 
     Next 
     If WaitForProcess = 0 Then 
      WScript.Sleep 1000 
      tries = tries - 1 
     End If 
    Wend 

End Function 

Правда, я не знаю, что многое из этого я передразнивал его из других сценариев. Например, я не уверен, что такое WMI и какова его роль в этом скрипте. Сообщение об ошибке, которое этот скрипт возвращает, является ошибкой компиляции. Он вызывает строку 60 символ 1, начало моей функции.

Любая помощь с этим была бы чрезвычайно оценена!

+0

Я забыл упомянуть, что это сценарий запуска. Причина, по которой в любой момент не отключена программа оболочки, заключается в том, что у меня есть пакетный файл, который закрывает все программы в определенное время и перезагружает компьютер. Процедура запуска перезапускает этот сценарий. – DtheHut

ответ

1
  1. Ваша функция WaitForProcess() вложена в ваш QADHelper под. VBScript не разрешает вложенные подпрограммы.
  2. Просто потому, что функция WaitForProcess() обнаруживает, что запуск EXE не означает, что отображается его окно, и оно готово к принятию ввода. Вы можете использовать AppActivate в цикле таймаута, чтобы ваши команды SendKeys достигли целевого окна.
  3. Вы создаете объект оболочки с именем WSHShell, который вы используете для Run, но вы также должны использовать его для своего вызова AppActivate и всех своих операторов SendKeys. Вы используете Shell, который не определен в вашем скрипте.
  4. SendKeys ожидает параметр строки. Ключи, как ENTER и TAB должны быть заключены в фигурные скобки в строке:

    WSHShell.SendKeys "{TAB}" 
    WSHShell.SendKeys "{ENTER}" 
    
  5. Вы должны использовать ElseIf вместо Else If. ElseIf рассматривается как предложение к вашему оригиналу If. Else If создает вложенный If, который ожидает End If.

+0

Я извиняюсь за недостаток знаний, но если функция не вложена в субпоставку, как мне это сделать? Мне нужно создать отдельный скрипт и вызвать его в моем суб? un-nesting в том же файле создает ошибку в «End Sub» – DtheHut

+0

См. новый № 5 выше. Я думаю, что ваши высказывания 'Else If' могут вызывать некоторые проблемы с управлением. Попробуйте исправить это и посмотрите, исправляет ли ваша ошибка 'Sub' при отключении. – Bond

+0

Ну, он больше не возвращает ошибку. Но это ничего не значит.Я собираюсь обновить код в своем op. – DtheHut

Смежные вопросы