Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   запуск в свернутом виде (start /min, cmd /K, exit) (http://forum.oszone.net/showthread.php?t=236476)

CyberMuesli 12-06-2012 01:43 1932662

запуск в свернутом виде (start /min, cmd /K, exit)
 
В 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.

Было бы интересно послушать мнения по данному вопросу.

ferget 12-06-2012 01:51 1932665

выложите скомпилированную программу, а то скачивать delphi ради одной программы не хочется

CyberMuesli 12-06-2012 01:55 1932666

Вложений: 1
Цитата:

Цитата ferget
выложите скомпилированную программу, а то скачивать delphi ради одной программы не хочется »


Iska 12-06-2012 07:48 1932691

Моё мнение таково:

* лично я всегда использую «exit /b», а не «goto :eof», так что, «придётся менять» — мимо;
* не вижу никакого смысла в сворачивании окон консоли командного процессора, ни из планировщика, ни интерактивно.

CyberMuesli 12-06-2012 08:18 1932704

Цитата:

Цитата Iska
лично я всегда использую «exit /b», »

exit /b не закроет окно CMD, только exit
Цитата:

Цитата Iska
не вижу никакого смысла в сворачивании окон консоли командного процессора, ни из планировщика, ни интерактивно. »

Пара примеров.
  1. Вы сидите в редакторе и занимаетесь копипастой. Неожиданно в планировщике срабатывает скрипт, перехватывает фокус ввода (что само по себе неприятно) и натыкается на Ctrl-C, предназначенное редактору (что неприятно вдвойне)
  2. Скрипт вызывает несколько скриптов (например 255), которые могут быть выполнены как последовательно (что долго), так и параллельно и запускаются через start. Чтобы не прерывалось наблюдение за основным скриптом удобно запускать не просто через start, а через start /min
  3. Как ни странно, программы могут вызывать скрипты, при этом такие вызовы могут происходить даже в диалоговом окне. Сбивание фокуса ввода и мелькание окон по ходу расстановки галок весьма неприятная вещь.

Foreigner 12-06-2012 08:30 1932706

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

CyberMuesli 12-06-2012 08:54 1932713

Цитата:

Цитата Foreigner
Надуманная проблема, имхо. Что легче использовать сторонний бинарник или прописать exit в батнике? »

Я написал, в чем затруднения с exit. Если проблема кажется надуманной - просто пройдите мимо.

Iska 12-06-2012 09:10 1932715

Цитата:

Цитата CyberMuesli
и натыкается на Ctrl-C, »

Не-а ;). Я использую Ctrl-Insert.

Цитата:

Цитата CyberMuesli
Скрипт вызывает несколько скриптов (например 255), которые могут быть выполнены как последовательно (что долго), так и параллельно и запускаются через start. Чтобы не прерывалось наблюдение за основным скриптом удобно запускать не просто через start, а через start /min »

Логично. Но, простите, что Вы собираетесь наблюдать в основном скрипте, если он при этом теряет всякую связь с дочерними?

CyberMuesli 12-06-2012 09:14 1932716

Цитата:

Цитата Iska
что Вы собираетесь наблюдать в основном скрипте, если он при этом теряет всякую связь с дочерними? »

почему он теряет связь? он ждет результатов

Iska 12-06-2012 09:23 1932722

Цитата:

Цитата CyberMuesli
почему он теряет связь? он ждет результатов »

Каким образом? Поясните.

CyberMuesli 12-06-2012 11:19 1932771

Цитата:

Цитата Iska
Каким образом? Поясните. »

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

Iska 12-06-2012 11:38 1932779

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

CyberMuesli 12-06-2012 14:53 1932889

Цитата:

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

Вы явно про что-то своё

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

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

Foreigner 12-06-2012 15:39 1932909

Цитата:

Цитата CyberMuesli
Я написал, в чем затруднения с exit. Если проблема кажется надуманной - просто пройдите мимо. »

Я высказал свое мнение. Так что не хамите.
Цитата:

Цитата CyberMuesli
Чтобы не прерывалось наблюдение за основным скриптом удобно запускать не просто через start, а через start /min »

Запускайте через start /b и не будут мелькать окна.

CyberMuesli 12-06-2012 15:46 1932911

Цитата:

Цитата Foreigner
Я высказал свое мнение. Так что не хамите. »

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

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

Foreigner 12-06-2012 15:56 1932919

Цитата:

Цитата 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

Второй и третий батник одинаковые

CyberMuesli 12-06-2012 17:47 1932994

Цитата:

Цитата Foreigner
ЧЯДНТ? У меня все отрабатывает и закрывается основное окно ( назовем main.cmd ), после того, как отработали все экземпляры запускаемых из него батников. »

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

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

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

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

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

Foreigner 12-06-2012 18:23 1933013

Цитата:

start /b не запускает программу параллельно
Запускает параллельно, а не последовательно, иначе пауза длилась бы не 2 секунды, а 4.
Цитата:

а так же не избавляет от необходимости предпринимать специальные меры для закрытия окна CMD после завершения скрипта
Запускаю главный батник, он отрабатывает и закрывается, затем, после того, как отработают остальные, закрывается само окно хоста.

Цитата:

main.cmd заканчивает свою работу РАНЬШЕ 2.cmd и 3.cmd, а не наоборот, как вы утверждаете.
В нем нет паузы, понятно, что он заканчивает раньше. Он запустил, и все, работу выполнил.
Цитата:

ключ /B приводит к полному хаосу в стандартном вводе и выводе
Зато не надо открывать много окон, что тоже плюс. Если есть необходимость смотреть вывод только главного батника, то можно скрывать вывод в запускаемых:
Код:

start /b cmd /c "1>nul 2.cmd"
Цитата:

моя цель - вовсе не ожидание не закончить 2 и 3 раньше, чем main.
Не совсем понял. Они заканчивают свою работу, как только отработают свой код. Какой раньше, а какой позже зависит только от этого.

CyberMuesli 12-06-2012 18:55 1933027

Цитата:

Цитата Foreigner
Цитата:
start /b не запускает программу параллельно
Запускает параллельно, »

Цитируйте полностью! "Было бы величайшей ошибкой думать" В.И.Ленин, ПСС, т.4

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

Цитата:

Цитата Foreigner
Не совсем понял »

Вот! Именно с этого я и начал.

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

Foreigner 12-06-2012 19:31 1933042

Цитата:

Цитата 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

CyberMuesli 12-06-2012 20:39 1933068

Цитата:

Цитата Foreigner
Ничего не изменится »

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

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

Foreigner 12-06-2012 22:30 1933123

Цитата:

Цитата CyberMuesli
Доказывать очевидное - самое сложное на свете занятие. »

Вы ничего и не доказывали. Не привели ни одного конкретно примера почему мой вариант не будет работать.

CyberMuesli 12-06-2012 22:43 1933127

Цитата:

Цитата Foreigner
Не привели ни одного конкретно примера почему мой вариант не будет работать. »

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

parkone 15-01-2013 04:36 2066967

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

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

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

CyberMuesli 15-01-2013 13:21 2067163

Цитата:

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

Спасибо. Мы работаем для вас! :-)

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

ramax 20-02-2013 09:47 2094897

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

sokol_alex_ 21-03-2013 11:45 2115502

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

CyberMuesli 21-03-2013 12:12 2115515

Цитата:

Цитата sokol_alex_
ОГРОМНОЕ СПАСИБО!!! »

Пожалуйста. Мы работаем для вас. :-)

Alexander S 19-06-2013 14:41 2170676

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

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

Так как не "пользую" Дельфи, предлагаю аналогичную программу на 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;
}


parkone 20-06-2013 08:23 2171057

Цитата:

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

тогда уж и скомпилированный файл выкладывайте )

Alexander S 24-06-2013 16:24 2173442

Вложений: 1
Цитата:

Цитата parkone
тогда уж и скомпилированный файл выкладывайте

выкладываю

rt467 29-12-2013 01:10 2280067

Спасибо за софтинку.
Забрал сишную версию.
Она мне ближе по духу )

Опиум 30-12-2013 11:07 2280624

спасибо. поскольку дельфи не выключается сразу и попробовал.
в ответ дарю winmin.exe [имя_окна]
если запустить без параметров, значит минимизирует сам себя)

Опиум 30-12-2013 11:09 2280625

Вложений: 1
сорри, забыл прикрепить)

CyberMuesli 30-12-2013 12:02 2280648

Цитата:

Цитата Опиум
в ответ дарю winmin.exe [имя_окна] »

Я бы на Вашем месте подарил бы winmin.pas

sermaxim 16-02-2018 10:38 2798292

Alexander S, Спасибо! Помогло!)

shadowbat 22-03-2019 10:16 2864563

Вложений: 2
еще можно попробовать
SetConsole.exe /minimize или /hide

Risovod 02-04-2019 18:21 2866355

Подскажите Путь, куда нужно расположить startmin.exe и как правильно сделать запись в автозапуске, чтобы работала программа (запуск BAT в свернутом виде)?

P.S. Запись:
startmin "C:\Users\111\Автозапуск виртуальной ОС.bat"
выдает ошибку - не удаётся найти startmin.exe (startmin.exe располагал рядом с Bat и в автозагрузку)

Iska 02-04-2019 18:41 2866362

Цитата:

Цитата Risovod
выдает ошибку - не удаётся найти startmin.exe »

Кто выдаёт ошибку?

Risovod 03-04-2019 16:30 2866471

Iska, ошибки при запуске bat-файла через AnVir Task Manager (запустить сейчас) после добавления его в автозагрузку.
Скрытый текст

Вопрос был в другом: как правильно организовать с помощью, обсуждаемого здесь, startmin.exe запуск bat-файла (запуск виртуальной ОС через VirtualBox) в свернутом виде.

Iska 03-04-2019 19:57 2866489

Risovod, как же «в другом», когда у Вас проблемы именно со startmin.exe?!

Risovod 04-04-2019 12:54 2866554

Iska, Вы знаете ответ на мой вопрос или просто набираете количество сообщений?

Iska 05-04-2019 00:40 2866657

Risovod, дабы у Вас больше не возникало претензий подобного рода — дальше без меня.

alpap 05-04-2019 02:43 2866662

Цитата:

Цитата Risovod
startmin.exe располагал рядом с Bat »

а вот это как раз и не имеет значения при таком запуске
Цитата:

Цитата Risovod
startmin "C:\Users\111\Автозапуск виртуальной ОС.bat" »

это ведь из командной строки запускаете? Оттуда где нет startmin.exe, конечно или из другого bat, НЕ рядом с которым лежит утилита,
потому как все работает как должно:
до запуска
Файл 157104
после запуска
Файл 157105

Risovod 05-04-2019 17:27 2866750

Цитата:

Цитата alpap
это ведь из командной строки запускаете? »

Нет.
Цитата:

Цитата Risovod
ошибка при запуске bat-файла через AnVir Task Manager (запустить сейчас) после добавления его в автозагрузку »

делаю запись в bat-файле и потом запускаю. При этом startmin.exe и bat-файл находятся рядом.
Пробовал так как указано в шапке темы:
Код:

startmin cmd /c dir c:\*.*
startmin "C:\Users\111\Автозапуск виртуальной ОС.bat"

прописывал это в bat-файле и потом запускал через AnVir Task Manager, но всё равно окно консоли не скрывается.
Если правильно Вас понял, то при запуске из командной строки мне нужно было прописать:
Код:

С:\>startmin.exe "C:\Users\111\Автозапуск виртуальной ОС.bat"
, а как правильно это прописать в автозагрузку?

Для временного выхода создал скрипт AHK, который сворачивает окно консоли и следом запускающейся виртуальной ОС (VirtualBoxVM.exe), но это всё равно не выход, так как окна всё равно мелькают на экране и всё равно не скрываются в трее.

P.S. Iska, не хотел Вас обидеть, но Вы сами понимаете, что это вышло исходя из Вашего желания заняться неким "поучением" без каких либо предложений в решении поставленной просьбы. Да, видя Ваш статус и количество благодарностей, Вы многим помогли, но в данном случае все сообщения были направлены на просто поговорить с желанием указать на какие-то недостатки.
Вы же могли уже в первом сообщении написать что-то вроде:
Я не использую startmin.exe
Цитата:

Цитата Iska
...* лично я всегда использую «exit /b»...»

поэтому для данной задачи советую использовать bat-файл с такой-то записью...; или с такой-то записью в автозапуске; или, если даже не используете startmin.exe, но знаете как правильно его использовать для данной задачи, то подробно описать способ.
Поэтому, всё же предлагаю, если есть желание и возможность, помочь в решении поставленной задачи.

P.P.S. Понимаю, что описываемые в данной теме способы направлены только на отображение окна консоли, тем не менее и на этом этапе пока не добился успеха. Хотя перепробовал, на сколько правильно я их понял, много способов из интернета (путем прописывания команд в самом bat-файле и его ярлыке), но достичь поставленной задачи не получилось, а именно конечный итог должен быть:
Сделать автозапуск виртуальной ОС (это решается bat-файлом с записью "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "Win XP") без появления окон консоли и запускаемого приложения. Кроме того, значок приложения должен сразу прятаться в трей, а не отображаться на панели задач.

alpap 05-04-2019 23:00 2866783

Risovod, так вам нужен скрытный запуск окна - это другая тема и разбиралось много раз, например здесь
вот моя утилита, bat для скрытия подавать параметром:
Код:

hide_cmd.exe name.bat
hide_cmd.exe

Risovod 06-04-2019 09:50 2866795

alpap, спасибо. В понедельник попробую.
P.S. в пятницу еще смог запустить bat в скрытом виде с помощью vbs
Код:

Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "C:\Автозапуск виртуальной ОС.bat" & Chr(34), 0
Set WshShell = Nothing



Время: 23:56.

Время: 23:56.
© OSzone.net 2001-