Option Explicit
Dim wmiObj, proCollection, scrShell
Set wmiObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set proCollection = wmiObj.ExecQuery("Select * from Win32_Process Where Name = 'Calc.exe'")
If proCollection.Count = 0 Then
' Wscript.Echo "Калькулятор не запущен."
Set scrShell = CreateObject("WScript.Shell")
scrShell.Run "Calc.exe", 1
'Else
' Wscript.Echo "Калькулятор уже запущен."
End If
.bat @ Windows
Можно-ли создать коммандный bat-скрипт,выполняющий такую операцию: Проверка,запущено ли приложение,и если нет,то запуск этого приложения.
Вот пара примеров сценариев.
1. Используются средства WMI и WSH:
Код:
2. Используются средства только WSH:
Код:
Option Explicit
Dim scrShell, resAct
Set scrShell = CreateObject("WScript.Shell")
resAct = scrShell.AppActivate("Калькулятор")
If resAct = False Then
' Wscript.Echo "Калькулятор не запущен."
scrShell.Run "Calc.exe", 1
'Else
' Wscript.Echo "Калькулятор уже запущен."
End If
Dim scrShell, resAct
Set scrShell = CreateObject("WScript.Shell")
resAct = scrShell.AppActivate("Калькулятор")
If resAct = False Then
' Wscript.Echo "Калькулятор не запущен."
scrShell.Run "Calc.exe", 1
'Else
' Wscript.Echo "Калькулятор уже запущен."
End If
В .bat-файле напишите: [color=blue]wscript.exe script.vbs[/color] (или [color=blue]cscript.exe script.vbs[/color]), где script.vbs - имя файла, содержащего нужный сценарий.
"Закомментированные" строки, разумеется, можно удалить. Они нужны лишь для отлатдки.
[color=red]Обратите внимание[/color] на то, что запрос WMI обращается к приложению по имени его исполняемого модуля ([color=blue]Name='Calc.exe'[/color]), а метод WSH .AppActivate - по заголовку окна ([color=blue].AppActivate("Калькулятор")[/color]).
Ещё несколько вопросов:
А на машину дополнительно нужно что-либо устанавливать?
Это на Окнах2000 тоже будет работать?
А как выглядит команда "открыть файл в приложении"?
И наверное последний вопрос: Можно-ли из командного файла запустить программу так,чтобы окно не открывалось(типа демон),или лежало в трее?
Цитата:
А на машину дополнительно нужно что-либо устанавливать?
Нет.
Цитата:
Это на Окнах2000 тоже будет работать?
Проверено на Windows 2000 Pro/XP Pro.
Цитата:
А как выглядит команда "открыть файл в приложении"?
Можно-ли из командного файла запустить программу так,чтобы окно не открывалось(типа демон),или лежало в трее?
Можно-ли из командного файла запустить программу так,чтобы окно не открывалось(типа демон),или лежало в трее?
Пример 1:
Код:
Option Explicit
Dim wmiObj, proCollection, scrShell, fsObj
Set wmiObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set proCollection = wmiObj.ExecQuery("Select * from Win32_Process Where Name = 'Notepad.exe'")
If proCollection.Count = 0 Then
Set scrShell = CreateObject("WScript.Shell")
Set fsObj = CreateObject("Scripting.FileSystemObject")
If fsObj.FileExists("C:\Temp\text.txt") = True Then
'---
'Окно приложения не отображается вообще
'scrShell.Run "Notepad.exe C:\Temp\text.txt", 0
'---
'Окно приложения отображается в виде значка на панели задач
scrShell.Run "Notepad.exe C:\Temp\text.txt", 2
'---
End If
End If
Dim wmiObj, proCollection, scrShell, fsObj
Set wmiObj = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set proCollection = wmiObj.ExecQuery("Select * from Win32_Process Where Name = 'Notepad.exe'")
If proCollection.Count = 0 Then
Set scrShell = CreateObject("WScript.Shell")
Set fsObj = CreateObject("Scripting.FileSystemObject")
If fsObj.FileExists("C:\Temp\text.txt") = True Then
'---
'Окно приложения не отображается вообще
'scrShell.Run "Notepad.exe C:\Temp\text.txt", 0
'---
'Окно приложения отображается в виде значка на панели задач
scrShell.Run "Notepad.exe C:\Temp\text.txt", 2
'---
End If
End If
Пример 2:
Код:
Option Explicit
Dim scrShell, resAct, fsObj
Set scrShell = CreateObject("WScript.Shell")
resAct = scrShell.AppActivate("text.txt - Блокнот")
If resAct = False Then
Set fsObj = CreateObject("Scripting.FileSystemObject")
If fsObj.FileExists("C:\Temp\text.txt") = True Then
'---
'Окно приложения не отображается вообще
'scrShell.Run "Notepad.exe C:\Temp\text.txt", 0
'---
'Окно приложения отображается в виде значка на панели задач
scrShell.Run "Notepad.exe C:\Temp\text.txt", 2
'---
End If
End If
Dim scrShell, resAct, fsObj
Set scrShell = CreateObject("WScript.Shell")
resAct = scrShell.AppActivate("text.txt - Блокнот")
If resAct = False Then
Set fsObj = CreateObject("Scripting.FileSystemObject")
If fsObj.FileExists("C:\Temp\text.txt") = True Then
'---
'Окно приложения не отображается вообще
'scrShell.Run "Notepad.exe C:\Temp\text.txt", 0
'---
'Окно приложения отображается в виде значка на панели задач
scrShell.Run "Notepad.exe C:\Temp\text.txt", 2
'---
End If
End If
- вариант с использованием WMI гарантирует то, что приложение будет запущено только один раз;
- вариант без использования WMI гарантирует лишь то, что приложение [color=blue]с указанным для открывания файлом[/color] будет запущено только один раз, но оно может быть уже запущено с другим файлом или без файла.
Код:
"C:\Documents and Settings\USER\ђ Ў®зЁ© бв®«\MegaFon.lnk"
CD "D:\SOFT\Program Files\INTERNET\"
TOONEL\toonel.jar
Firefox\firefox.exe
pause
MIRANDA\miranda32.exe
CD "D:\SOFT\Program Files\INTERNET\"
TOONEL\toonel.jar
Firefox\firefox.exe
pause
MIRANDA\miranda32.exe
Выполнение скрипта останавливается после выполнения строки 3. Не выдаётся каких либо ошибок/cooбщений,окно терминала остаётся открытым.
Следующая строка выполняется только после того,как закрыть приложение,запущенное скриптом.
Кракозябры в первой строке это "Рабочий стол" в DOS кодировке.
Код:
"C:\Documents and Settings\USER\ђ Ў®зЁ© бв®«\MegaFon.lnk"
CD "D:\SOFT\Program Files\INTERNET\"
start TOONEL\toonel.jar
start FireFox\firefox.exe
pause
start MIRANDA\miranda32.exe
CD "D:\SOFT\Program Files\INTERNET\"
start TOONEL\toonel.jar
start FireFox\firefox.exe
pause
start MIRANDA\miranda32.exe
Почему-то Я не знал о команде "start". Cлучайно наткнулся на пример кода здесь.
Строку "c:\Documents and Settings\USER\ђ Ў®зЁ© бв®«" вполне можно заменить системной переменной %USERPROFILE%
Цитата: Dmitrii
.
респект, красиво расписал
Есть ли возможность в командных файлах создать диалоговые запросы?
Ты пишешь для себя или на распространение?
Нет,для себя. Моя деятельность вообще не связана с программированием...
- скопировать choice.exe(com) с установочного диска Win98(ME)
- переходить на MSH (Microsoft Command Shell, aka Monad)
Цитата: FIRESTARTER
Оказывается в Win не работает команда CHOICE! Ужас!
Есть ли возможность в командных файлах создать диалоговые запросы?
Есть ли возможность в командных файлах создать диалоговые запросы?
Можно через set /p
Код:
set /p a="choice 1, 2 or 3: "
if %a% equ 1 (
run some code1
goto next
)
if %a% equ 2 (
run some code2
goto next
)
if %a% equ 3 (
run some code3
)
:next
if %a% equ 1 (
run some code1
goto next
)
if %a% equ 2 (
run some code2
goto next
)
if %a% equ 3 (
run some code3
)
:next
Большое спасибо,то что надо!