2016-06-14 3 views
0

У меня есть несколько файлов VBS (каждый из которых открывает другой файл, ту же программу), и я хотел открыть их все, не нажимая на все их. Я могу заставить их открывать без проблем, если я использую скрипт python, который я создал, и выполняю с NPPExec из Notepad ++. Способ, которым я хочу, чтобы файлы открывались (с использованием ранее установленного метода), заключается в том, чтобы открыть программу + файл -> нажать несколько штрихов клавиатуры -> повторить. Проблема, с которой я сталкиваюсь, заключается в том, что когда я дважды нажимаю на файл python, он открывает только программу + первый файл -> делать штрихи клавиатуры, а затем для следующих файлов он откроет только программу. Я вполне уверен, что эта проблема вызвана тем, что не имеет правильного окна в фокусе, когда скрипт VBS проходит через нажатия клавиш, они не работают в правильном окне. У меня есть пакетный файл, который я попробовал, и у меня такая же проблема.Python или пакетный файл для открытия нескольких файлов vbs (файлы vbs открывают программу + файл)

VBS файл, который открывает программу + файл -> KEYSTROKES Я пытался использовать App.Activate без удачи

Dim objShell 
Set objShell = WScript.CreateObject("WScript.Shell") 
objShell.Run """C:\Program Files (x86)\Program\Program.exe""" & """C:\temp_folder\file.ext""" 
objShell.AppActivate """C:\Program Files (x86)\Program\Program.exe""" 
WScript.Sleep 3000 
objShell.SendKeys "{TAB}" 
objShell.SendKeys "{TAB}" 
objShell.SendKeys "{UP}" 
objShell.SendKeys "{TAB}" 
objShell.SendKeys "{DOWN}" 
objShell.SendKeys "{ENTER}" 

Python код, чтобы открыть несколько файлов VBS работает так, как я хотите, но только если работать с Notepad ++ и NPPExec Двойной щелчок на питон скрипт не работает надлежащим образом

import os 
import time 
import subprocess 
alfs = [] 
for file in os.listdir(os.getcwd()): 
    if file.endswith(".ext"): 
     alfs.append(file) 

for f, item in enumerate(alfs): 
    subprocess.call('cmd /c %s'%alfs[f])  
    time.sleep(2) 

Пакетный файл для открытия нескольких файлов VBS Я запускаю пакетный файл, дважды щелкнув по нему, и результаты похожи на метод двойного щелчка Python.

for /r "." %%a in (*.vbs) do %%~fa 

Я в основном собираю код, который я нашел, чтобы заставить его работать, как я хочу. Я хорошо понимаю Python, но я совершенно не знаком с VBS и Batch.

ответ

0

С сЕРИЙНОГО точки зрения DOS, это должно помочь вам:

FOR %%G IN (file1.txt file2.txt file3.txt) DO start notepad.exe %%G 

Вы можете внести необходимые изменения для обработки VBS файлов.

+0

Я пробовал это, но я не думаю, что он решает проблему, которую я хочу решить. –

+1

это не DOS, это пакет окон. –

1

AppActivate Method ссылка:

активирует окно приложения.

  • Синтаксис: object.AppActivate title
  • Аргументы:
    • объект: WshShell объект.
    • title: Указывает, какое приложение необходимо активировать. Это может быть строка, содержащая заголовок приложения (как указано в в строке заголовка) или приложения ID процесса.

Убедитесь, что строка подается на objShell.AppActivate либо название желаемого экземпляра из Program.exe или это идентификатор процесса.

В дополнение к SendKeys Method ссылка, читайте Sending Keystrokes to a Program. Эта статья объясняет фундаментальную недостаточность вашалюбых сценария - временная проблема:

Вы должны знать, что отправка нажатий клавиш в приложении не оптимальный метод для автоматизации процедуры. Если у вас есть приложение на вашем предприятии, которое вам необходимо автоматизировать, и у него нет объектной модели на основе COM , вы можете рассмотреть эту технику. Тем не менее, вы должны сначала проверить, существуют ли другие методы для автоматизации это конкретное приложение.

Хотя SendKeys могут быть эффективно использованы, есть несколько потенциальных проблемы с этим подходом:

  • Сценарий может быть трудно определить, какое окно для отправки нажатий клавиш.
  • Поскольку приложение работает в режиме графического интерфейса пользователя, пользователь может закрыть приложение преждевременно. К сожалению, это не приведет к завершению сценария , и сценарий может в конечном итоге отправить нажатия клавиш на неправильное приложение.
  • Сценарий может быть затруднен синхронизацией с приложением.

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

и использованием AppActivate:

Перед отправкой нажатий клавиш в приложение, вы должны сначала убедиться , что приложение работает и что фокус находится на приложения (то есть, приложение работает в активном окне ).
...
Вы можете разместить свой скрипт в цикле, периодически вызывать AppActivate, пока возвращаемое значение не будет True. В этот момент приложение загружается и готово к принятию нажатий клавиш.
...
Когда сценарий определяет, какое приложение активировать, данный заголовок сравнивается с названием каждого окна, видимого на экране. Если нет точного соответствия, метод AppActivate устанавливает фокус на первое окно, название которого начинается с данного текста.Если окно еще не найдено, первое окно, строка заголовка которого заканчивается , текст получает фокус. Частичное совпадение с ведущим и завершающим текстом заголовков гарантирует, что AppActivate работает с приложениями , такими как «Блокнот», которые отображают имя открытого в данный момент документа в строке заголовка. (Например, при первом запуске Notepad, заголовок окна Untitled - Notepad, не Notepad.)
...

(Выше цитаты дайджест только со своими акцентами: слишком долго цитировать всю статью здесь.)

Редактировать.

Давайте лицевая сторона вверх, что SendKeys метод отправляет нажатие клавиши (ы) для активного окна взгляда невидимой, как на самом деле мы никогда не знаем какого окна в настоящее время сосредоточены. Воспользоваться от Run Method (Windows Script Host) полного синтаксиса objShell.Run sCmdLine, 1, False где стиль окна 1 смысла

  • 1Активизирует и отображает окно. Если окно минимизировано или максимизировано, система восстанавливает его до его первоначального размера и . Приложение должно указать этот флаг при отображении окна в первый раз.

Испытан с помощью следующего сценария образца (с комментариями для лучшего понимания):

option explicit 
On Error GoTo 0 

Dim objShell, sProgram, sTxtFile, sTxtPath, sCmdLine, sTxtExists 
Set objShell = WScript.CreateObject("WScript.Shell") 

sProgram = "C:\Windows\System32\notepad.exe" 
sTxtFile = Replace(Wscript.ScriptName, ".vbs", ".txt", 1, -1, vbTextCompare) 
sTxtPath = CreateObject("Scripting.FileSystemObject").BuildPath(_ 
      objShell.ExpandEnvironmentStrings("%temp%"), sTxtFile) 
sTxtExists = CreateObject("Scripting.FileSystemObject").FileExists(sTxtPath) 

    ' delete file merely for testing and debugging to ensure that 
    '    `NOTEPAD` will ask whether create nonexistent file 
If sTxtExists Then CreateObject("Scripting.FileSystemObject").DeleteFile(sTxtPath) 
WScript.Sleep 500      ' wait for deleting 

sCmdLine = """" & sProgram & """ """ & sTxtPath & """" 
objShell.Run sCmdLine, 1, False 
       ' this `1` activates currently launched notepad 
       '   and its possible initial dialogue takes focus 
WScript.Sleep 1000  ' hence, `AppActivate` is not necessary 

            ' alternative to `DeleteFile(sTxtPath)` 
' If NOT sTxtExists Then   ' answer initial dialogue only if necessary 
    objShell.SendKeys "{TAB}" 
    WScript.Sleep 100 
    objShell.SendKeys "{TAB}" 
    WScript.Sleep 100 
    objShell.SendKeys "{TAB}" 
    WScript.Sleep 100 
    objShell.SendKeys "{ENTER}" 
    WScript.Sleep 100 
' End If 
objShell.SendKeys Cstr(Now) 
WScript.Sleep 100 

Однако, есть еще один время и фокуса проблемы в вашем пусковой установке. Может ли Python time.sleep(2)? Наверняка нет: каждый vbs сценарий ждет 3 секунды до первого SendKeys, но следующий запускается каждые 2 секунды!

Исходный эквивалент пакетного сценария: Timeout command приостанавливает командный процессор на указанное количество секунд.
Продольный 1>NUL hides output отсчет Waiting for X seconds, press CTRL+C to quit ...

for /r "." %%a in (*.vbs) do (
    C:\Windows\System32\wscript.exe "%%~fa" 
    timeout /T 5 /NOBREAK 1>NUL 
) 

Would 5 секунд хватает?

+0

Я понимаю недостатки в использовании SendKeys, но для программы/файлов, которые я открываю, это был единственный вариант, который я мог придумать. Я использовал правильное имя для App.Activate, но есть всплывающий диалог, который появляется при открытии файла (в котором сделаны нажатия клавиш), однако этот диалог не вызывается отдельно от программы. Я попытался выяснить, как использовать идентификатор процесса, но не смог найти хороший способ получить идентификатор # при использовании команды «Запуск», поскольку команда Exec не будет работать для моей ситуации (я думаю) –

+0

@ bachelor.party ответ обновлен. НТН. – JosefZ