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

Компьютерный форум 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 | Цитировать


Цитата Foreigner:
Ничего не изменится »
Честно говоря, я очень устал. Доказывать очевидное - самое сложное на свете занятие. Потому что если очевидное приходиться доказывать - дело совсем плохо. Если у вас ничего не изменится - замените во всех скриптах exit/b на exit и наслаждайтесь тем, что ничего не изменилось. Ну и вообще, можно написать претензию в микрософт о том, что exit/b бесполезная команда, поскольку полностью эквивалентна exit.

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

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


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


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



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

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


Ветеран


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

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


Цитата CyberMuesli:
Доказывать очевидное - самое сложное на свете занятие. »
Вы ничего и не доказывали. Не привели ни одного конкретно примера почему мой вариант не будет работать.

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


Аватара для CyberMuesli

Старожил


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

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


Цитата Foreigner:
Не привели ни одного конкретно примера почему мой вариант не будет работать. »
я это устал объяснять. если хотите - перечитайте предыдущие сообщения. если вы хотите понять - я могу собрать волю в кулак и попытаться объяснить. но мне кажется, ваша цель - спорить непонятно о чем до хрипоты

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


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


Новый участник


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

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


Спасибо за программу! То что нужно!

Сначала попробовал NirCmd от NirSoft с параметрами min и hide (запускал NumLock Calculator через плановщик), так во-первых окошко программы всегда появлялось (не сворачивалось), во-вторых мигало черное окно. А Startmin сделал именно то что требовалось - запустить в свернутом виде.

Нужно сделать эту утилиту достоянием масс )
Особенно актуально это становится в Windows 8, где UAC при ползунке вниз полностью не отключается, и некоторые программы приходится запускать от имени администратора через плановщик (например, чтоб тот же NumLock Calculator вызывался из программ запущенных от имени администратора, иначе винда не дает к нему доступа).

Отправлено: 04:36, 15-01-2013 | #24


Аватара для CyberMuesli

Старожил


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

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


Цитата parkone:
Спасибо за программу! То что нужно!
Нужно сделать эту утилиту достоянием масс ) »
Спасибо. Мы работаем для вас! :-)

ps. Воспользуйтесь кнопкой "полезное сообщение"

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


Отправлено: 13:21, 15-01-2013 | #25


Новый участник


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

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


т.к всё вышеперечисленное не сработало
запустил прогу как сервис с помощью anyserv
http://forum.oszone.net/thread-68513.html

Отправлено: 09:47, 20-02-2013 | #26


Новый участник


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

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


ОГРОМНОЕ СПАСИБО!!!
Пишу WSH скрипт для регулярного автообновления базы данных. Промудохался вчера пол дня с мигающими CMD окнами... Думал так и не нарою решения, а тут Ваш пост. Зарегистрировался только ради того, чтобы поблагодарить
Простая прога, но очень полезная...

Отправлено: 11:45, 21-03-2013 | #27


Аватара для CyberMuesli

Старожил


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

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


Цитата sokol_alex_:
ОГРОМНОЕ СПАСИБО!!! »
Пожалуйста. Мы работаем для вас. :-)

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


Отправлено: 12:12, 21-03-2013 | #28


Новый участник


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

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


Спасибо автору темы за программу.

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

Так как не "пользую" Дельфи, предлагаю аналогичную программу на VC++.
Код: Выделить весь код
#include "stdafx.h"
#include <atlstr.h>
#include <shellapi.h>

#define SPACECHAR   _T(' ')
#define DQUOTECHAR  _T('\"')

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
    // пропускается первый токен в командной строке - имя запускаемой программы (с проверкой на двойные кавычки)
    LPTSTR pCommandLine = lpCmdLine;
    BOOL bDoubleQuote = FALSE;
    while (*pCommandLine > SPACECHAR || (*pCommandLine && bDoubleQuote))
    {    
        if (*pCommandLine == DQUOTECHAR) bDoubleQuote = !bDoubleQuote;
        ++pCommandLine;
    }

    // пропускаются незначащие символы и пробелы перед вторым токеном - параметрами запускаемой программы
    while (*pCommandLine && (*pCommandLine <= SPACECHAR))
    {
        *pCommandLine = _T('\0');    //ограничение строки имени запускаемой программы
        pCommandLine++;
    }

    //запуск программы в свернутом окне
    ShellExecute(NULL, NULL, lpCmdLine, pCommandLine, NULL, SW_SHOWMINNOACTIVE);
    
    return FALSE;
}

Отправлено: 14:41, 19-06-2013 | #29


Новый участник


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

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


Цитата Alexander S:
Так как не "пользую" Дельфи, предлагаю аналогичную программу на VC++. »
тогда уж и скомпилированный файл выкладывайте )

Отправлено: 08:23, 20-06-2013 | #30



Компьютерный форум 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




 
Переход