Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - запуск в свернутом виде (start /min, cmd /K, exit)

Ответить
Настройки темы
CMD/BAT - запуск в свернутом виде (start /min, cmd /K, exit)

Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Изменения
Автор: CyberMuesli
Дата: 12-06-2012
В Win9x команда start была отдельным исполняемым модулем start.exe
В WinXP/server START стала командой CMD.EXE со следующими нюансами:
  • даже если указан ключ /MIN все равно кратковременно мигает черное окошко, в котором запускается сам CMD.EXE, выполняющий команду START.
  • если с помощью START запускается BAT-файл, то он запускается с использованием CMD /K, при этом окно CMD после завершения BAT-файла не закрывается
  • последнее обстоятельство приводит к весьма существенным затруднениям.

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

Допустим, есть BAT, который прекрасно работает. Мы его решили запускать через start /min из планировщика. Всего-то изменение способа запуска повлечет неприятную необходимость менять код: все goto :eof придется заменить на EXIT + поставить EXIT в конце (иначе окно не закроется и со временем накопится столько незакрытых черных окон, что сервер упадет). При этом BAT станет непригоден для использования, если он вызывается из другого BAT (т.к. завершится весь процесс CMD). Получается, если ставить цель написать сценарий, корректно работающий в различных вариантах запуска, необходимо следовать правилу, согласно которому, каждому сценарию должна в параметрах передаваться информацию о способе его запуска, а этот сценарий, в свою очередь, должен снабжать этой же информацией другие сценарии в цепочке, передавая ее параметрах вызова.

Все это крайне неприятно, если не иметь отдельный исполняемый EXE модуль (как в Win9x), выполняющий запуск процесса/сценария в свернутом виде.

Я решил проблему такой программкой на дельфи. Это снимает все негативные моменты + дает дополнительный бонус в виде отсутствия мелькания черных окон и/или сбивания фокуса при запуске из планировщика. Первый параметр - имя процесса (можно указывать EXE и также непосредственно BAT, без полного пути и расширения), остальные - параметры запускаемого процесса. Например:
startmin cmd /c dir c:\*.*
startmin "c:\Admin scripts\daily backup.bat" "\\server\common files\*.*"

Код: Выделить весь код
program startmin;

uses
  SysUtils, Windows,ShellAPI;
var Param,ProgCmdLine:AnsiString; i:integer;

begin
   ProgCmdLine := '';
   for i:= 2 to ParamCount do begin
       if i >= 3 then
          ProgCmdLine := ProgCmdLine +' ';
       Param := ParamStr(i);
       if Pos(' ',Param) <> 0 then
          Param := '"'+Param+'"';
       ProgCmdLine := ProgCmdLine + Param;
   end;
   ShellExecute(0,nil,PChar(ParamStr(1)),PChar(ProgCmdLine),nil,SW_SHOWMINNOACTIVE);
end.
Было бы интересно послушать мнения по данному вопросу.

-------
Кибер Мюсли

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:43, 12-06-2012

 

Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Iska:
Каким образом? Поясните. »
Поясните, каким образом он теряет связь?
результатом может быть наличие-отсутствие файлов-семафоров, доступность ресурсов, состояние аппаратуры - что угодно

-------
Кибер Мюсли


Отправлено: 11:19, 12-06-2012 | #11



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

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


То бишь, чтобы организовать связь, дочерний пакетный файл всё одно придётся править.

Отправлено: 11:38, 12-06-2012 | #12


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Iska:
То бишь, чтобы организовать связь, дочерний пакетный файл всё одно придётся править. »
Вы явно про что-то своё

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

Так или иначе любые действия приходится программировать. Мне кажется, Вы не уловили основную мысль: речь не о том, что startmin волшебным образом позволяет ничего не делать, а о том, что дочерний скрипт можно писать, не думая о том, каким способом он вызван и как обеспечить закрытие окна CMD.

-------
Кибер Мюсли


Отправлено: 14:53, 12-06-2012 | #13


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата CyberMuesli:
Я написал, в чем затруднения с exit. Если проблема кажется надуманной - просто пройдите мимо. »
Я высказал свое мнение. Так что не хамите.
Цитата CyberMuesli:
Чтобы не прерывалось наблюдение за основным скриптом удобно запускать не просто через start, а через start /min »
Запускайте через start /b и не будут мелькать окна.

Отправлено: 15:39, 12-06-2012 | #14


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Я высказал свое мнение. Так что не хамите. »
Поскольку буквы не передают интонации, значит Вы их выдумали сами.

Мнение немного поверхностное, я написал в чем трудности с EXIT. start /b забавный ключ, но не запускает программу в свернутом виде, а так же не избавляет от необходимости предпринимать специальные меры для закрытия окна CMD после завершения скрипта. Все это следствие того, что проблема кажется Вам надуманной и Вы не хотите в нее вникнуть.

-------
Кибер Мюсли


Отправлено: 15:46, 12-06-2012 | #15


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата CyberMuesli:
так же не избавляет от необходимости предпринимать специальные меры для закрытия окна CMD после завершения скрипта »
ЧЯДНТ? У меня все отрабатывает и закрывается основное окно ( назовем main.cmd ), после того, как отработали все экземпляры запускаемых из него батников. Пример:
Код: Выделить весь код
:: main.cmd
@echo off

start /b cmd /c "2.cmd"
start /b cmd /c "3.cmd"
echo 1 2 3
exit /b
Код: Выделить весь код
:: 2.cmd и 3.cmd
@echo off

echo.
for /l %%i in (0,1,3) do echo %%i
1>nul ping -n 3 ya.ru
echo exit
exit /b
Второй и третий батник одинаковые

Отправлено: 15:56, 12-06-2012 | #16


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
ЧЯДНТ? У меня все отрабатывает и закрывается основное окно ( назовем main.cmd ), после того, как отработали все экземпляры запускаемых из него батников. »
Вы все делаете не так. В предыдущем сообщении я сказал, что start /b не запускает программу параллельно в свернутом виде (т.е. в отдельном свернутом окне), а так же не избавляет от необходимости предпринимать специальные меры для закрытия окна CMD после завершения скрипта. Вы это проигнорировали и настаиваете, что start /b решает эти проблемы.

Кроме того, ключ /B приводит к полному хаосу в стандартном вводе и выводе, потому что окно одно на всех.

Кроме того, вы не видите, что main.cmd заканчивает свою работу РАНЬШЕ 2.cmd и 3.cmd, а не наоборот, как вы утверждаете.

Кроме того, вы не поняли, что моя цель - вовсе не закончить 2 и 3 раньше, чем main.

Итого, вы уводите беседу очень далеко и совсем в другую сторону.

-------
Кибер Мюсли


Последний раз редактировалось CyberMuesli, 12-06-2012 в 18:14.


Отправлено: 17:47, 12-06-2012 | #17


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата:
start /b не запускает программу параллельно
Запускает параллельно, а не последовательно, иначе пауза длилась бы не 2 секунды, а 4.
Цитата:
а так же не избавляет от необходимости предпринимать специальные меры для закрытия окна CMD после завершения скрипта
Запускаю главный батник, он отрабатывает и закрывается, затем, после того, как отработают остальные, закрывается само окно хоста.

Цитата:
main.cmd заканчивает свою работу РАНЬШЕ 2.cmd и 3.cmd, а не наоборот, как вы утверждаете.
В нем нет паузы, понятно, что он заканчивает раньше. Он запустил, и все, работу выполнил.
Цитата:
ключ /B приводит к полному хаосу в стандартном вводе и выводе
Зато не надо открывать много окон, что тоже плюс. Если есть необходимость смотреть вывод только главного батника, то можно скрывать вывод в запускаемых:
Код: Выделить весь код
start /b cmd /c "1>nul 2.cmd"
Цитата:
моя цель - вовсе не ожидание не закончить 2 и 3 раньше, чем main.
Не совсем понял. Они заканчивают свою работу, как только отработают свой код. Какой раньше, а какой позже зависит только от этого.

Отправлено: 18:23, 12-06-2012 | #18


Аватара для CyberMuesli

Старожил


Сообщения: 207
Благодарности: 18

Профиль | Отправить PM | Цитировать


Цитата Foreigner:
Цитата:
start /b не запускает программу параллельно
Запускает параллельно, »
Цитируйте полностью! "Было бы величайшей ошибкой думать" В.И.Ленин, ПСС, т.4

Не запускает параллельно в свернутом окне.

Цитата Foreigner:
Не совсем понял »
Вот! Именно с этого я и начал.

Вы не уловили основную мысль: цель - чтобы дочерний скрипт можно писать, не думая о том, каким способом он вызван и как обеспечить закрытие окна CMD. Ваш способ start /b имеет дополнительные недостатки с выводом + не обеспечит закрытие окна в случае запуска из планировщика задач через start /b или start /min. Если же Вы замените exit /b на exit в main.cmd, вы сделаете этот скрипт непригодным для вызова в качестве дочернего из другого родительского скрипта.

-------
Кибер Мюсли


Отправлено: 18:55, 12-06-2012 | #19


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Цитата CyberMuesli:
Если же Вы замените exit /b на exit в main.cmd, вы сделаете этот скрипт непригодным для вызова в качестве дочернего из другого родительского скрипта. »
Ничего не изменится. Можно смело убрать из всех exit ключ /b . Или вообще убрать exit из дочерних, cmd /c лишнего не отработает, только батник.
Цитата CyberMuesli:
Не запускает параллельно в свернутом окне. »
А оно надо? Я вообще запускаю в фоне. Ну раз вам не нравится, то рассматривайте, как альтернативу. Или вообще не рассматривайте, дело ваше.
Цитата CyberMuesli:
не обеспечит закрытие окна в случае запуска из планировщика задач через start /b или start /min. »
Попробовал, запускает и закрывает окно без лишних движений. Но надо в планировщик, например:
Код: Выделить весь код
schtasks /create /sc once /tn test /tr "cmd /c start /min c:\path\to\1.cmd" /st 19:29

Отправлено: 19:31, 12-06-2012 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - запуск в свернутом виде (start /min, cmd /K, exit)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
есть ли утилитка для win7, которая автоматич запускает в свернутом виде программы? HarrysFerrarievich Хочу все знать 5 15-12-2011 12:16
fsck died with exit code 4 hnsk Общий по Linux 2 20-09-2010 23:08
[решено] Как после команды Run выполнить Exit Centrinar AutoIt 5 01-02-2010 21:30
kde cannot start :((( DominuS Общий по Linux 7 04-05-2005 07:00
CD Start-It BORIS YK Хочу все знать 3 15-12-2003 00:10




 
Переход