Тема: CMD/BAT: Запуск 3 программ
Здравствуйте. Нужен простенький скрипт что бы запускать 3 программы одним кликом. Пробовал написать .cmd, но не много не разобралься. Подскажите пожалуйста как это сделать средствами WSH и CMD.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Здравствуйте. Нужен простенький скрипт что бы запускать 3 программы одним кликом. Пробовал написать .cmd, но не много не разобралься. Подскажите пожалуйста как это сделать средствами WSH и CMD.
Пакетный файл:
@echo off
start "" "%SystemRoot%\system32\notepad.exe"
start "" "%SystemRoot%\system32\calc.exe"
start "" "%ProgramFiles%\Process Explorer\procexp.exe"
Windows Script Host:
Option Explicit
With WScript.CreateObject("WScript.Shell")
.Run """" & .ExpandEnvironmentStrings("%SystemRoot%\system32\notepad.exe") & """"
.Run """" & .ExpandEnvironmentStrings("%SystemRoot%\system32\calc.exe") & """"
.Run """" & .ExpandEnvironmentStrings("%ProgramFiles%\Process Explorer\procexp.exe") & """"
End With
WScript.Quit 0
А можно ли сделать так что бы программы запускались тока после окончательного запуска предыдущей? Что имено в таком порядке как прописаны в скрипте они были упорядочены на панели задач.
А можно ли сделать так что бы программы запускались тока после окончательного запуска предыдущей?
Как только в программировании появится такое понятие, как «окончательный запуск», не раньше. Что Вы подразумеваете под этим термином?
Я имею в виду вот что, я стартую 3 программы: 3DsMax, PROMT 8, notepad. И мне хотелось бы иметь их имено в таком порядке на панели задач (Панель ПУСК, Панель Quick Launch, 3DsMax, PROMT 8, notepad). Запуская же через скрипт одновремено, такая "легкая" программа как notepad запускаеться быстрее чем остальные и поставляеться в панель задач первой.
0meg@, это хорошая новость, что мы разобрались, что нужно получить в итоге. А вот плохая: заявленными средствами этого не получить. Что Вам удобнее: исполняемый файл на основе AutoIt/AutoHotKey/VB.Net, возможно PowerShell (?, сам учусь, но, думаю, можно попробовать реализовать), скрипт на VBScript с использованием стороннего компонента, пакетный файл+утилита для работы с окнами. При любом озвученном Вами выборе дополнительно потребуется провести некоторую работу — отследить названия класса основного окна каждого из трёх озвученных приложений; как это сделать — озвучу позже, после Вашего выбора.
Уважаемый alexii, если честно как бывшему програмисту, мне ужасно интересно решение всеми озвучеными средствами, но я бы предпочел наверное VBScript так как в данное время использую его в своей работе с Corel Draw (однако вам все таки виднее чем данную задачу решить будет проще и целесообразнее).
Возможно стоить модифицировать скрипт на задержку (пусть она будет условно определенной на глаз, скажем 10-15 секунд) между запусками программ?
alexii, извиняюсь, что вклиниваюсь не в свою епархию, «окончательный запуск» — это, по всей видимости, появление соответствующих окон. На это и нужно ориентироваться.
я бы предпочел наверное VBScript
Тогда что-то наподобие такого:
Option Explicit
Dim strMyDocs
strMyDocs = WScript.CreateObject("Shell.Application").NameSpace("shell:Personal").Self.Path
If RunWaitWindow("C:\Program Files\Microsoft Office\OFFICE11\winword.exe", strMyDocs, "[CLASS:OpusApp]", 30) Then
If RunWaitWindow("C:\Program Files\Microsoft Office\OFFICE11\excel.exe", strMyDocs, "[CLASS:XLMAIN]", 30) Then
If RunWaitWindow("C:\Windows\System32\notepad.exe", "E:\Песочница", "[CLASS:Notepad]", 10) Then
WScript.Echo "Все приложения запущены успешно"
End If
End If
End If
WScript.Quit 0
'=============================================================================
'=============================================================================
Function RunWaitWindow(strApp, strWorkingDir, strWindowTitle, intWaitInterval)
RunWaitWindow = False
With WScript.CreateObject("AutoItX3.Control")
If .Run("""" & strApp & """", strWorkingDir, .SW_SHOW) <> 0 Then
If .WinWait(strWindowTitle, "" , intWaitInterval) = 1 Then
RunWaitWindow = True
Else
WScript.Echo "Окно «" & strWindowTitle & "» не найдено"
End If
Else
WScript.Echo "Приложение «" & strApp & "» не удалось запустить"
End If
End With
End Function
'=============================================================================
Поскольку у меня в наличии только Блокнот, остальное заменил на приложения из комплекта Microsoft Office. Загрузите и установите библиотеку AutoItX из комплекта AutoIt. Замените параметры в вызовах:
If RunWaitWindow("C:\Program Files\Microsoft Office\OFFICE11\winword.exe", strMyDocs, "[CLASS:OpusApp]", 30)…
на свои. Класс основного окна приложения можно определить, воспользовавшись утилитой «%ProgramFiles%\AutoIt3\Au3Info.exe» из того же комплекта AutoIt.
Замечание: в данном варианте скрипта есть ограничение — перед запуском скрипта ни одно из перечисленных в скрипте приложений не должно быть запущено.
Друзья так не было бы легче...
set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad.exe",1, True
WshShell.Run "calc.exe",1, True
WshShell.Run "cmd.exe",1, True
2armenxxx1: нет, не было бы, поскольку:
.Run … , True
означает, что следующая за «.Run()» команда не будет исполнена, пока не будет завершено запущенное приложение.
Установил требующиеся библиотеки и вобще весь пакет. Обнаружилась ошибка, вызваная классом окна программы PROMT 8.
Третья программа вообще не стартует, а данное окно об ошибки выскакивает после завершения программы пользователем.
Проще и надёжнее организовать последовательный запуск с задержками соответствующими весу каждого приложения.
Для примера возьмём задержку по 10 секунд.
Пишем батник (приложения естественно указывайте свои):
@echo off
set Wait=PING LOCALHOST -n
start "" "C:\Program Files\VISUAL STUDIO\VB98\VB6.EXE"
%Wait% 10
start "" "C:\Program Files\Microsoft Virtual PC\Virtual PC.exe"
%Wait% 10
start "" "%SystemRoot%\system32\notepad.exe"
Подколибруйте задержку под свои нужды.
Ну а потом, если хотите, можно укоротить пути в dos 8.3 и аккуратненько прописать весь код в ярлыке.
Проще и надёжнее организовать последовательный запуск с задержками соответствующими весу каждого приложения.
Для примера возьмём задержку по 10 секунд.
Пишем батник (приложения естественно указывайте свои):
@echo off
set Wait=PING LOCALHOST -n
start "" "C:\Program Files\VISUAL STUDIO\VB98\VB6.EXE"
%Wait% 10
start "" "C:\Program Files\Microsoft Virtual PC\Virtual PC.exe"
%Wait% 10
start "" "%SystemRoot%\system32\notepad.exe"
Подколибруйте задержку под свои нужды.
Ну а потом, если хотите, можно укоротить пути в dos 8.3 и аккуратненько прописать весь код в ярлыке.
alexii, а зачем вызывать AutoItX откуда-то, если установлен AutoIt, можно ведь все через него? Хотя если ТС хочет именно средствами VBS, то тут конечно другое дело.
Проще и надёжнее…
Ага, уж как надёжнее… . Вы это серьёзно, коллега? Сидеть и тупо ждать заданное время, независимо от того, запущена ли уже программа або ещё нет. И рано или поздно, но обязательно столкнуться с тем, что время ожидания оказалось мало.
…можно укоротить пути в dos 8.3
Мда…
Обнаружилась ошибка, вызваная классом окна программы PROMT 8.
Да, это так. Дело в том, что класс окна у этого приложения меняется при каждом запуске. Можно воспользоваться, например, постоянной частью текста заголовка и/или постоянной частью класса окна, наподобие:
…
If RunWaitWindow("C:\Program Files\PRMT8\PRMT\prmt.exe", strMyDocs, "[REGEXPTITLE:PROMT Editor.*; REGEXPCLASS:Afx:00400000:8:00010011:00000000:.*]", 30) Then
…
alexii, а зачем вызывать AutoItX откуда-то, если установлен AutoIt, можно ведь все через него? Хотя если ТС хочет именно средствами VBS, то тут конечно другое дело.
Ну, да, так было озвучено в посте #7. А сам AutoIt появился позже, вследствие необходимости получения AutoItX.
А может, делать в цикле WshShell.AppActivate, пока не вернёт код успеха, а потом уже запускать следующую программу?
The AppActivate method returns a Boolean value that identifies whether the procedure call is successful.
Сидеть и тупо ждать заданное время
Не вижу тут ничего смешного. Внимательнее читайте.
Подколибруйте задержку под свои нужды.
Время запуска "тяжёлого приложения" на отдельно взятой машине почти всегда одинаково. Понадобится всего один раз засечь(/вычислить) и подогнать задержку в скрипте чтобы потом пользоваться и не отвлекаться на всякого рода ошибки
А может, делать в цикле WshShell.AppActivate
Я как раз об этом сейчас и подумал!
Ваш пост подкрепил мои "опасения".
set wshell=CreateObject ("Wscript.shell")
do UNTIL wshell.Appactivate ("PROMT") = True
wsh.sleep 1000
loop
....
'Запуск следующего приложения
...
А может, делать в цикле WshShell.AppActivate, пока не вернёт код успеха, а потом уже запускать следующую программу?
Я тоже сразу про это подумал, но отказался из-за:
…but it does not affect whether it is maximized or minimized.
Время запуска "тяжёлого приложения" на отдельно взятой машине почти всегда одинаково.
…и зависит от ряда величин в данный конкретный момент времени — загрузки процессора, количества свободной физической памяти (свопирование).
AppActivate Method пишет:…but it does not affect whether it is maximized or minimized.
Ну и что? Что в этой фразе такого? Активирует, не меняя макси/минимизированного состояния.
Значит, меня подвело опять знание иностранного языка .
и зависит от ряда величин в данный конкретный момент времени - загрузки процессора, количества свободной физической памяти (свопирование).
Думаю, НЕ в данном случае:
имено в таком порядке на панели задач (Панель ПУСК, Панель Quick Launch, 3DsMax, PROMT 8, notepad)
это говорит о том что запуск ПО происходит на "пустом" рабочем столе (т.е. когда панель задач ещё пустая), что в конечном итоге говорит нам о том что память свободна.
Это ни о чём не говорит.
это говорит о том что запуск ПО происходит на "пустом" рабочем столе
Замерьте время, тщательнейшим образом всё рассчитайте, сделайте Ваш скрипт. Запустите. Всё работает.
Теперь запустите простой скрипт (для одного ядра; для двух и более запустите по такому скрипту на каждое ядро, назначив им соответствие в диспетчере задач):
Do
a = 2
Loop
Попробуйте теперь запустить Ваш скрипт. Как думаете, насколько удачно он отработает?
Помоему, уже пошла откровенная демагогия.
Это теперь так называется отсутствие аргументов и нежелание признать свою ошибку?
Уже и ошибка где-то появилась?
bat-скрипт конечно-же работает в стиле "гротеск", но от этого нисколько не хромает (в отличии например от предложенного Вами vbs'а с внешними библиотеками и всякими костылями)
bat-скрипт конечно-же работает…
Не работает. Наивно полагать, что запуск приложения в реальных условиях будет всегда занимать заданное время.
…в отличии например от предложенного Вами vbs'а с внешними библиотеками и всякими костылями
Обоснуйте, пожалуйста, про «…всякие костыли», коллега.
Можно увидеть полный текст для метода WshShell.AppActivate, я так понял это тоже сработает.
3 программы действительно будут запускаться на "свободной\пустой" машине, без других приложений, о задержке при вызове я тоже думал, но конечно если бы можно было бы все сделать правильно и запускать программы поочередно как сейчас через AutoIT, но в рамках одного языка скажем VBS + WSH было бы лучше. Кстати если не трудно можно увидеть как будет выглядить скрипт полностью на языке AutoIt?
Можно увидеть полный текст для метода WshShell.AppActivate, …
Примерно так:
Option Explicit
RunWaitWindow "C:\Program Files\Microsoft Office\OFFICE11\winword.exe", "Microsoft Word"
RunWaitWindow "C:\Program Files\Microsoft Office\OFFICE11\excel.exe", "Microsoft Excel"
RunWaitWindow "C:\Windows\System32\notepad.exe", "Блокнот"
WScript.Quit 0
'=============================================================================
'=============================================================================
Sub RunWaitWindow(strApp, strWindowTitle)
With WScript.CreateObject("WScript.Shell")
If .Run("""" & strApp & """", 1) = 0 Then
Do
WScript.Sleep 100
Loop Until .AppActivate(strWindowTitle)
Else
WScript.Echo "Приложение «" & strApp & "» не удалось запустить"
End If
End With
End Sub
'=============================================================================
Вторым параметром в «RunWaitWindow» указывать постоянную часть заголовка окна; эта часть должна приходиться либо на начало, либо на конец заголовка окна.
…я так понял это тоже сработает.
Да, коллега YMP просветил меня в этом отношении.
…можно увидеть как будет выглядить скрипт полностью на языке AutoIt?
Почти без изменений:
AutoItSetOption("MustDeclareVars", 1)
If RunWaitWindow("C:\Program Files\Microsoft Office\OFFICE11\winword.exe", @MyDocumentsDir, "[CLASS:OpusApp]", 30) Then
If RunWaitWindow("C:\Program Files\Microsoft Office\OFFICE11\excel.exe", @MyDocumentsDir, "[CLASS:XLMAIN]", 30) Then
If RunWaitWindow("C:\Windows\System32\notepad.exe", "E:\Песочница", "[CLASS:Notepad]", 10) Then
ConsoleWrite("Все приложения запущены успешно" & @CRLF)
EndIf
EndIf
EndIf
Exit(0)
;=============================================================================
;=============================================================================
Func RunWaitWindow($sApp, $sWorkingDir, $sWindowTitle, $iWaitInterval)
Local $bResult = False
If Run("""" & $sApp & """", $sWorkingDir, @SW_SHOW) <> 0 Then
If WinWait($sWindowTitle, "" , $iWaitInterval) <> 0 Then
$bResult = True
Else
ConsoleWriteError("Окно «" & $sWindowTitle & "» не найдено" & @CRLF)
EndIf
Else
ConsoleWriteError("Приложение «" & $sApp & "» не удалось запустить" & @CRLF)
EndIf
Return $bResult
EndFunc
;=============================================================================
Разве что «WinWait()» при успехе возвращает не просто «1», а хэндл окна.
Это достаточно просто. А вот ежели нужно будет запускать и отслеживать появление окон именно запускаемых экземпляров приложений (например, запускаем «Блокнот», а у нас уже есть несколько запущенных «Блокнотов»), тогда только AutoItX/AutoIt/PoSH.
Большое спасибо всем за помощь, скрипт работает.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться