1

Тема: CMD/BAT: Запуск 3 программ

Здравствуйте. Нужен простенький скрипт что бы запускать 3 программы одним кликом. Пробовал написать .cmd, но не много не разобралься. Подскажите пожалуйста как это сделать средствами WSH и CMD.

2

Re: CMD/BAT: Запуск 3 программ

Пакетный файл:

@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

Re: CMD/BAT: Запуск 3 программ

А можно ли сделать так что бы программы запускались тока после окончательного запуска предыдущей? Что имено в таком порядке как прописаны в скрипте они были упорядочены на панели задач.

4

Re: CMD/BAT: Запуск 3 программ

0meg@ пишет:

А можно ли сделать так что бы программы запускались тока после окончательного запуска предыдущей?

Как только в программировании появится такое понятие, как «окончательный запуск», не раньше. Что Вы подразумеваете под этим термином?

5 (изменено: 0meg@, 2010-10-28 07:13:30)

Re: CMD/BAT: Запуск 3 программ

Я имею в виду вот что, я стартую 3 программы: 3DsMax, PROMT 8, notepad. И мне хотелось бы иметь их имено в таком порядке на панели задач (Панель ПУСК, Панель Quick Launch, 3DsMax, PROMT 8, notepad). Запуская же через скрипт одновремено, такая "легкая" программа как notepad запускаеться быстрее чем остальные и поставляеться в панель задач первой.

6

Re: CMD/BAT: Запуск 3 программ

0meg@, это хорошая новость, что мы разобрались, что нужно получить в итоге. А вот плохая: заявленными средствами этого не получить. Что Вам удобнее: исполняемый файл на основе AutoIt/AutoHotKey/VB.Net, возможно PowerShell (?, сам учусь, но, думаю, можно попробовать реализовать), скрипт на VBScript с использованием стороннего компонента, пакетный файл+утилита для работы с окнами. При любом озвученном Вами выборе дополнительно потребуется провести некоторую работу — отследить названия класса основного окна каждого из трёх озвученных приложений; как это сделать — озвучу позже, после Вашего выбора.

7

Re: CMD/BAT: Запуск 3 программ

Уважаемый alexii, если честно как бывшему програмисту, мне ужасно интересно решение всеми озвучеными средствами, но я бы предпочел наверное VBScript так как в данное время использую его в своей работе с Corel Draw (однако вам все таки виднее чем данную задачу решить будет проще и целесообразнее).
Возможно стоить модифицировать скрипт на задержку (пусть она будет условно определенной на глаз, скажем 10-15 секунд) между запусками программ?

8

Re: CMD/BAT: Запуск 3 программ

alexii, извиняюсь, что вклиниваюсь не в свою епархию, «окончательный запуск» — это, по всей видимости, появление соответствующих окон. На это и нужно ориентироваться.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

9

Re: CMD/BAT: Запуск 3 программ

я бы предпочел наверное 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.
Замечание: в данном варианте скрипта есть ограничение — перед запуском скрипта ни одно из перечисленных в скрипте приложений не должно быть запущено.

10 (изменено: armenxxx1, 2010-10-29 20:18:31)

Re: CMD/BAT: Запуск 3 программ

Друзья так не было бы легче...

set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "notepad.exe",1, True
WshShell.Run "calc.exe",1, True
WshShell.Run "cmd.exe",1, True

11

Re: CMD/BAT: Запуск 3 программ

2armenxxx1: нет, не было бы, поскольку:

.Run … , True

означает, что следующая за «.Run()» команда не будет исполнена, пока не будет завершено запущенное приложение.

12

Re: CMD/BAT: Запуск 3 программ

Установил требующиеся библиотеки и вобще весь пакет. Обнаружилась ошибка, вызваная классом окна программы PROMT 8.
http://www.pictureshack.ru/images/5605error_mes.JPG
Третья программа вообще не стартует, а данное окно об ошибки выскакивает после завершения программы пользователем.

13

Re: CMD/BAT: Запуск 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 и аккуратненько прописать весь код в ярлыке.

14

Re: CMD/BAT: Запуск 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 и аккуратненько прописать весь код в ярлыке.

15

Re: CMD/BAT: Запуск 3 программ

alexii, а зачем вызывать AutoItX откуда-то, если установлен AutoIt, можно ведь все через него? Хотя если ТС хочет именно средствами VBS, то тут конечно другое дело.

autoit@conference.jabber.ru - Конференция скриптового языка AutoIt на jabber.ru

16

Re: CMD/BAT: Запуск 3 программ

Аскет пишет:

Проще и надёжнее…

Ага, уж как надёжнее… . Вы это серьёзно, коллега? Сидеть и тупо ждать заданное время, независимо от того, запущена ли уже программа або ещё нет. И рано или поздно, но обязательно столкнуться с тем, что время ожидания оказалось мало.

Аскет пишет:

…можно укоротить пути в dos 8.3

Мда…

0meg@ пишет:

Обнаружилась ошибка, вызваная классом окна программы PROMT 8.

Да, это так. Дело в том, что класс окна у этого приложения меняется при каждом запуске. Можно воспользоваться, например, постоянной частью текста заголовка и/или постоянной частью класса окна, наподобие:

    …
    If RunWaitWindow("C:\Program Files\PRMT8\PRMT\prmt.exe", strMyDocs, "[REGEXPTITLE:PROMT Editor.*; REGEXPCLASS:Afx:00400000:8:00010011:00000000:.*]", 30) Then
    …

17

Re: CMD/BAT: Запуск 3 программ

kaster пишет:

alexii, а зачем вызывать AutoItX откуда-то, если установлен AutoIt, можно ведь все через него? Хотя если ТС хочет именно средствами VBS, то тут конечно другое дело.

Ну, да, так было озвучено в посте #7. А сам AutoIt появился позже, вследствие необходимости получения AutoItX.

18

Re: CMD/BAT: Запуск 3 программ

А может, делать в цикле WshShell.AppActivate, пока не вернёт код успеха, а потом уже запускать следующую программу?

The AppActivate method returns a Boolean value that identifies whether the procedure call is successful.

19

Re: CMD/BAT: Запуск 3 программ

alexii пишет:

Сидеть и тупо ждать заданное время

Не вижу тут ничего смешного. Внимательнее читайте.

Аскет пишет:

Подколибруйте задержку под свои нужды.

Время запуска "тяжёлого приложения" на отдельно взятой машине почти всегда одинаково. Понадобится всего один раз засечь(/вычислить)  и подогнать задержку в скрипте чтобы потом пользоваться и не отвлекаться на всякого рода ошибки

20

Re: CMD/BAT: Запуск 3 программ

YMP пишет:

А может, делать в цикле WshShell.AppActivate

Я как раз об этом сейчас и подумал!
Ваш пост подкрепил мои "опасения".

set wshell=CreateObject ("Wscript.shell")
do UNTIL wshell.Appactivate ("PROMT") = True
 wsh.sleep 1000
loop
....
'Запуск следующего приложения
...

21

Re: CMD/BAT: Запуск 3 программ

YMP пишет:

А может, делать в цикле WshShell.AppActivate, пока не вернёт код успеха, а потом уже запускать следующую программу?

Я тоже сразу про это подумал, но отказался из-за:

AppActivate Method пишет:

…but it does not affect whether it is maximized or minimized.

Аскет пишет:

Время запуска "тяжёлого приложения" на отдельно взятой машине почти всегда одинаково.

…и зависит от ряда величин в данный конкретный момент времени — загрузки процессора, количества свободной физической памяти (свопирование).

22

Re: CMD/BAT: Запуск 3 программ

alexii пишет:
AppActivate Method пишет:

…but it does not affect whether it is maximized or minimized.

Ну и что? Что в этой фразе такого? Активирует, не меняя макси/минимизированного состояния.

23

Re: CMD/BAT: Запуск 3 программ

Значит, меня подвело опять знание иностранного языка .

24

Re: CMD/BAT: Запуск 3 программ

alexii пишет:

и зависит от ряда величин в данный конкретный момент времени - загрузки процессора, количества свободной физической памяти (свопирование).

Думаю, НЕ в данном случае:

имено в таком порядке на панели задач (Панель ПУСК, Панель Quick Launch, 3DsMax, PROMT 8, notepad)

это говорит о том что запуск ПО происходит на "пустом" рабочем столе (т.е. когда панель задач ещё пустая), что в конечном итоге говорит нам о том что память свободна.

25

Re: CMD/BAT: Запуск 3 программ

Это ни о чём не говорит.

26

Re: CMD/BAT: Запуск 3 программ

это говорит о том что запуск ПО происходит на "пустом" рабочем столе

27

Re: CMD/BAT: Запуск 3 программ

Замерьте время, тщательнейшим образом всё рассчитайте, сделайте Ваш скрипт. Запустите. Всё работает.

Теперь запустите простой скрипт (для одного ядра; для двух и более запустите по такому скрипту на каждое ядро, назначив им соответствие в диспетчере задач):

Do
    a = 2
Loop

Попробуйте теперь запустить Ваш скрипт. Как думаете, насколько удачно он отработает?

28

Re: CMD/BAT: Запуск 3 программ

Помоему, уже пошла откровенная демагогия.

29

Re: CMD/BAT: Запуск 3 программ

Это теперь так называется отсутствие аргументов и нежелание признать свою ошибку?

30

Re: CMD/BAT: Запуск 3 программ

Уже и ошибка где-то появилась?
bat-скрипт конечно-же работает в стиле "гротеск", но от этого нисколько не хромает (в отличии например от предложенного Вами vbs'а с внешними библиотеками и всякими костылями)

31

Re: CMD/BAT: Запуск 3 программ

Аскет пишет:

bat-скрипт конечно-же работает…

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

Аскет пишет:

…в отличии например от предложенного Вами vbs'а с внешними библиотеками и всякими костылями

Обоснуйте, пожалуйста, про «…всякие костыли», коллега.

32

Re: CMD/BAT: Запуск 3 программ

Можно увидеть полный текст для метода WshShell.AppActivate, я так понял это тоже сработает.
3 программы действительно будут запускаться на "свободной\пустой" машине, без других приложений, о задержке при вызове я тоже думал, но конечно если бы можно было бы все сделать правильно и запускать программы поочередно как сейчас через AutoIT, но в рамках одного языка скажем VBS + WSH было бы лучше. Кстати если не трудно можно увидеть как будет выглядить скрипт полностью на языке AutoIt?

33

Re: CMD/BAT: Запуск 3 программ

0meg@ пишет:

Можно увидеть полный текст для метода 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» указывать постоянную часть заголовка окна; эта часть должна приходиться либо на начало, либо на конец заголовка окна.

0meg@ пишет:

…я так понял это тоже сработает.

Да, коллега YMP просветил меня в этом отношении.

0meg@ пишет:

…можно увидеть как будет выглядить скрипт полностью на языке 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.

34

Re: CMD/BAT: Запуск 3 программ

Большое спасибо всем за помощь, скрипт работает.