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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Example | Скрываем чужую консоль (http://forum.oszone.net/showthread.php?t=29630)

hasherfrog 29-06-2004 15:40 205023

Example | Скрываем чужую консоль
 
Данная малюсенькая прога призвана решить проблему, описанную здесь. Действительно, иногда "болтающееся" черное окно консоли раздражает. Поэтому мы напишем хитрую "обертку" для конcольных приложений, которые запускают программу, но прячут её основное консольное окно.

Код:

#include <process.h>
#include <stdio.h>
#include <windows.h>
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmd,int nCmd)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
 
    /* create process with new console */
    memset(&si,0,sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    if( CreateProcess( NULL, lpszCmd,
                       NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
                       NULL, NULL, &si, &pi ) )
    {
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    }
 
    /* terminate this */
    return 0;
}

FAQ

Q. И как использовать?
A. Компилите. Кладёте результат (например hidec.exe) в c:\windows\system32. Вместо стандартного запуска "целевого" консольного приложения идёте в Пуск->Выполнить, набираете hidec.exe путь\имя_целевого_приложения. Консольное приложение будет запущено, но его окна Вы не увидите.

Q. Эй, а где оно? И как его теперь закрыть?
A. Посмотрите через Ctrl+Alt+Del. Снимать с выполнение - там же. Если "целевое" приложение умеет само закрываться после окончания своей работы, то оно так и сделает.

Q. А может, лучше _default.pif настроить, или ярлык с определёнными свойствами сделать?
A. Я никого не заставляю делать именно по-моему.

Q. Как компилить?
A. Я использую Visual C++ Toolkit. Компиляция:
cl hide_console.cpp /GA /O1 /link /defaultlib:advapi32.lib /defaultlib:user32.lib

Q. И что, я в своих консольных приложениях такое должен делать?
A. Нет. В "своём" консольном приложении используёте FreeConsole(), или пишите через WinMain, а не main(). Данная "обёртка" нужна для чужих приложений.

Q. А есть ли бинарник?
A. Есть. Тут пока лежит.

Q. Что это ты такой добрый? Вирус, наверное, хочешь впарить...
A. Просто интересы совпали. А потом, :oszone:

Q. Можно использовать в моих программах куски текста?
A. Да, сделано специально для посетителей www.oszone.net

Q. У меня ещё вопросы...
A. Задавайте здесь, я отвечу.

NoOne 20-01-2005 02:25 290255

Отличная утилитка, спасибо!
Реально ли сделать так, что бы скрытое окно можно было просмотреть, скажем, по нажатию сочетания клавиш?

hasherfrog 27-06-2005 15:07 336406

Тут возник вопрос: как бы приостановить действие батника, содержащего несколько последовательных вызовов hidec? Дело в том, что в таком случае программы вызываются практически одновременно, а иногда надо подождать сначала завершения одного процесса, а затем выполнить вызов следующего приложения.

Вот ответ:

Код:

#include <process.h>
#include <stdio.h>
#include <windows.h>
 
int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lpszCmd,int nCmd)
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    int bWait = 0;

    if ((lpszCmd[0] == '/')&&(lpszCmd[1] == 'W')&&(lpszCmd[2] == 0x20))
    { bWait = 1; lpszCmd += 3; }

    /* create process with new console */
    memset(&si,0,sizeof(si));
    si.cb = sizeof(si);
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;
    if( CreateProcess( NULL, lpszCmd,
                      NULL, NULL, FALSE, CREATE_NEW_CONSOLE,
                      NULL, NULL, &si, &pi ) )
    {
        if (bWait) WaitForSingleObject(pi.hProcess, INFINITE);
        CloseHandle( pi.hProcess );
        CloseHandle( pi.hThread );
    }
 
    /* terminate this */
    return 0;
}

Вызовы из батника выглядят так (это просто ни к чему не обязывающий пример):

Код:

hidec.exe dontwaitme_1.exe
hidec.exe dontwaitme_2.exe
hidec.exe /W 1st_app_with_wait.exe
@echo Stage 1 completed...
...
hidec.exe /W 2nd_app_(also_wait).bat
@echo Stage 2 completed...
...

Программа hidec, вызванная с параметром /W будет ждать выполнения "своего" процесса.
Надеюсь, кому-то пригодится. Готовый (скомпилёный) вариант екзешника: тут (22K, сжато в зип до 11К)

Vadikan 27-06-2005 23:09 336493

hasherfrog
Спасибо! Я так понял, что /W - case sensitive?

Добавлено: хм, почему-то timestamp файла забежал в будущее... Архив с нормальным временем, а файл внутри 6/27/05 14:58. У меня сейчас 14:13 :)

hasherfrog 28-06-2005 02:48 336543

Vadikan
>> /W - case sensitive?
Да. Лень было писать нормальную разборку синтаксиса :-( Теоретически можно было написать ((lpszCmd[1]|0x40) == 'W') - стал бы инсенситив. Только я спешил очень. Если надо, завтра перекомпилю. Но тут вопрос такой... Понимаешь, это всё равно кривой разбор строки. Например, пара пробелов вместо одного - и ничего не запустится :-( Соответственно, в инструкции по эксплуатации я должен был бы написать: "Внимательно формируйте командную строку!!!" - и этим снять с себя обязательства за AS IS. Или написать нормальный парсер, а это не улыбается (сегодня, так-то он у меня где-то валяется; или стандартный можно подцепить, правда, за счёт увеличения размера файла).

>> хм, почему-то timestamp файла забежал в будущее...
Ты забыл, где ты, а где я? :-)
А таймстамп у архива получился нормальный, потому что он (как скачанный файл) получил время окончания скачки. Это в настройках браусвера где-то, емнип.

hasherfrog 28-06-2005 10:10 336586

Vadikan
:] К вопросу о размере... Savant'у есть что предложить :]
Сейчас только разберёмся с ключиками...

Savant 28-06-2005 11:31 336617

Вложений: 1
Код зазипован вместе с бинарником

Компиляция из ком. строки:
Код:

cl hidec.cpp /GA /O1 /link /subsystem:windows kernel32.lib advapi32.lib user32.lib
Исправленная версия (28.06.05, 14:30)

Vadikan 28-06-2005 13:26 336642

Насчет timestamp я потом уже догадался :)

Так, размер я вижу, значительно уменьшился и появилось окошко, об'ясняющее как юзать. Это хорошо. Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается. Что же касается пробелов лишних, то это проблемы того, кто составляет батник. Нормальные люди ставят один пробел перед ключом, а остальным такая утилита не нужна ;)

А почему такая разница в размерах, просветите?

P.S. Я тут по ходу дела протестировал утилиту не из батника, а из RunOnceEx - все работает и ключ тоже.

Savant 28-06-2005 13:47 336649

Vadikan
Цитата:

А почему такая разница в размерах, просветите?
В этой теме подробнее, а в принципе просто отброшена Run-Time Library + объединены секции (экономия еще ~1кб).

hasherfrog 28-06-2005 13:51 336651

>> А почему такая разница в размерах, просветите?

Дык это недавно обсуждалось у нас тут :] Я же говорил, что у меня по аналогии "с кондачка" не получилось (с ключам компиляции/линковки запарка была), но Savant проявил мужество :] и довёл дело до конца.

***

ЗЫ. Упс, опоздал :]]]

***

Savant

>> замена memcpy - кстати, а зачем?
Как раз дабы устранить использование стандартных ненужных библиотек.

Savant 28-06-2005 14:29 336660

Vadikan
Цитата:

Только вот ключ стал /w. Вы либо сделайте нечувствительным к регистру, либо верните /W, а то путаница получается.
Исправлено. Голова к вечеру начинает кое-что вспоминать ;]. Щас залью новые бинарник и исходник (через пару минут). К регистру нечувствительно.

hasherfrog
Я почему-то считал, что memset - своеобразный inline и трогать его не стал...

hasherfrog 28-06-2005 14:39 336663

Savant
Исправил на |0x40 на |0x20?
:] Балбесы.

>> memset - своеобразный inline и трогать его не стал...
Может и так. Но инклуд за инклудом тянет какую-то либу при линковке - я проверял.

Vadikan 28-06-2005 23:01 336774

hasherfrog & Savant
Спасибо. На MSFN утилиту же протестировали на Т-39 (за 39 минут до окончания установки виндовс, самый ранний этап на котором пользователь может запускать исполняеме файлы) - все работает.

Насчет разных редакторов я понял, а вот этого
Цитата:

>> memset - своеобразный inline и трогать его не стал...
Может и так. Но инклуд за инклудом тянет какую-то либу при линковке - я проверял.

мне не надо, спасибо :D

Savant 28-06-2005 23:14 336782

Vadikan
>> comments in Russian, though ;-)
LOL. Может правда перевести на англ.?

hasherfrog 29-06-2005 01:13 336824

>> мне не надо, спасибо :D
Ну ты это, заходи, если что... (c) Волк, "Жил-был пёс"
;-)

P.S. А тему мы завтра утречком почистим... Наверное. :-/

Vadikan 29-06-2005 02:01 336832


Savant
Да ну, вряд ли там кто вникать будет в комменты. Просто изначально в этой теме было с исходным кодом, так там и сделал.

hasherfrog
Да, это вам не букмарклетам русский эквивалент придумывать, тут целиком предложения на сленге :)


Vadikan 09-07-2005 23:16 339836

Утилита подверглась усиленному тестированию на MSFN. Как выяснилось, она не работает из cmdlines.txt. Команды внесенные в файл передаются командному интерпретатору в порядке их появления в файле. Синтаксис файла такой
Код:

[Commands]
"batch1.cmd"
"batch2.cmd"

Кавычки обязательны. (подробнее)
Не работает вариант
Код:

[Commands]
"hidec.exe batch.cmd"

Как об'яснил в PM Savant
Цитата:

Дело в том, что там исполняемая строка полностью заключена в кавычки, а в алгоритме разбора исполняемой строки учитывается случай, когда имя файла заключается в кавычки, т.е. например "x:\path with spaces\hidec.exe" /w cmd.exe
hasherfrog, я поднял тему, т.к. не уверен что ты в курсе :) Может у тебя возникнут красивые идеи решения проблемы? Понятно, что утилита не задумывалась для работы из cmdlines.txt, но все-таки... ;-)

Savant 10-07-2005 15:48 339954

Меня вот какие вопросы интересуют: а предполагается ли запуск из cmdlines.txt такой конструкции "<exe-file> <parameter(s)>" и в каком виде передается исполняемая строка?
Просто из командной строки, например, выполнить такое нельзя (все, что имеется в кавычках будет посчитано за имя файла и будет выдано сообщение """winmine /?"" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."). Тем не менее, почему-то прокатывает вариант "cmd /?"...

hasherfrog 10-07-2005 21:52 339999

"cmd /?" выполнить нельзя. Попробуйте не из командной строки, а из Пуск->Выполнить.
Vadikan, как-то не совсем понятно. Почитал-почитал доки по ссылке "почему"...
А если (без /w)
Код:

"hidec" "file1.cmd"
"hidec" "file2.cmd"

Или (с /w)
Код:

"hidec /w file1.cmd"
"hidec file2.cmd"

?

Всё дело в особенностях передачи аргументов в качестве командной строки. Я одно время очень тщательно разбирался с этим вопросом. И могу точно сказать, что в случае
Цитата:

т.е. например "x:\path with spaces\hidec.exe" /w cmd.exe
Будет так:
1. С использованием argv, argc:
аргумент 0: x:\path with spaces\hidec.exe - без кавычек
аргумент 1: /w
аргумент 2: cmd.exe
2. С простым разбором (как у Savant'а:
аргумент 0: x:\path with spaces\hidec.exe - не важно, но 99%, что без кавычек
аргумент 1: /w cmd.exe - без кавычек.

Нельзя писать так:
c:/> "hidec" "/w cmd"
c:/> "hidec /w cmd"
c:/> "hidec cmd"
Можно так:
c:/> "hidec" /w "cmd"
c:/> "hidec" /w cmd
c:/> hidec /w cmd

Что же касается файлов cmdlines.txt... Я не понял всё равно, почему Вы всё время пытаетесь запустить "hidec 1.cmd", а не "1.cmd", внутри которого куча hidec'ов? Есть, конечно, ещё вариант запрятать /w прямо внутрь hidec, т.е. сделать какой-нибудь wait4 (аналог hidec, но с ожиданием), если уж всё так упёрлось именно в /w. Будет две утилитки, а не одна?

Vadikan 11-07-2005 00:23 340018

hasherfrog
Цитата:

Vadikan, как-то не совсем понятно. Почитал-почитал доки по ссылке "почему"...
А если (без /w)

Да собственно /w в данном случае не причем. В cmdlines.txt этот ключ вообще не нужен, т.к. команды и так выполняются по очереди.
Цитата:

Что же касается файлов cmdlines.txt... Я не понял всё равно, почему Вы всё время пытаетесь запустить "hidec 1.cmd", а не "1.cmd", внутри которого куча hidec'ов?
Исключительно с эстетической точки зрения: чтобы консольные окна не мелькали. Это единственная причина. Просто маньяки автоустановки любят чтобы все было тихо-скрытно :)

Упирается-то не в ключ /w, a в то, что не срабатывает
Код:

[Commands]
"hidec.exe batch.cmd"

Впрочем, это по отчетам других пользователей. Я сейчас образ сделаю и сам проверю срабатывает или нет.

Vadikan 11-07-2005 08:05 340053

Добавлю новым постом. В общем, говорить о том, что совсем не работает
Код:

[Commands]
"hidec.exe batch.cmd"

некорректно. Оно работает, но консольные окна не скрываются. У меня было два батника, оба отработали, но и оба окна я видел.

hasherfrog 11-07-2005 09:09 340078

Vadikan
Я повторю. Предположим, есть batch.cmd, в котором происходит вызов пяти cmd.exe. Каждый из них будет открывать консоль самостоятельно. Итого - пять штук. Применённый как такому batch.cmd одноразовый hidec (i.e. hidec batch.cmd) скроет только окно консоли самого batch.cmd, на cmd.exe внутри он не подействует, потому что и не должен. Он обрубает только показ окна процесса-сына. Внуки вольны поступать, как им заблагорассудится. Более того, если бы, предположим, cmd.exe открывал два окна, скрывалось бы только первое. Поэтому я и настаиваю на использовании hidec внутри batch.cmd, попытка "обернуть" серию консольных приложений не пройдёт никогда.

В примере, вызов hidec batch.cmd:
Код:

file1.exe
fil2.cmd
file3.bat

ничего не даст, но вызов batch.cmd
Код:

hidec file1.exe
hidec fil2.cmd
hidec file3.bat

именно то, что нужно.

Надеюсь, объяснил.



Savant 11-07-2005 09:12 340081

hasherfrog
Но в таком случае окно batch.cmd будет висеть все время выполнения внутренних команд...

hasherfrog 11-07-2005 09:28 340087

Savant
Ну да. Поэтому для "полной заглушки" нужно ещё и hidec batch.cmd. Более того, в большинстве стандартных случаев (например, при выполнении батника с системными командами типа cls, dir и т.д.; а также при выполнении консольных приложений, которые довольствуются родительской консолью, а не открывают свою) достаточно одного вызова hidec'а, на собственно batch.cmd. Но в случае с cmdlines.txt очевидно, что процесс, отвечающий за отработку команд оттуда (из cmdlines.txt) вынимает команды по очереди и каждое очередное приложение не имеет родительской консоли, потому что консоль предыдущего приложения из очереди закрылось всесте с самим приложением.

Наверное, так. Чего-то я уже запутываюсь.

Vadikan 11-07-2005 09:30 340089

Цитата:

Цитата Savant
Но в таком случае окно batch.cmd будет висеть все время выполнения внутренних команд...

Именно! В этом все и дело.

hasherfrog
Я понимаю как пользоваться утилитой, и как вызывать при ее помощи пакетные файлы абсолютно незаметно. Я ж говорю, я протестировал и GuiRunOnce (исполняется из соотв. ключа реестра при первом входе в систему) и RunOnceEx (примерно тоже самое). В обоих случаях все работает, вызывается hidec batch.cmd и все ок.

Но в cmdlines.txt другой синтаксис. Команды перечисленные там передаются командному интерпретатору. Как передаются - хрен его знает. DOS команды там не работают, но виндовские приложения - да (REGEDIT и т.д). Но консольные окна hidec'ом не скрываются. Когда я говорю, что оин "мигают", я имею в виду, что у меня в самом батнике еще cmdow @ /HID со старых времен прописано, чтоб консольное окно не висело.

В общем, я знаю, что у тебя много работы. Утилита же не задумывалась для cmdlines.txt. Будет время - что-нибудь придумаешь. Не будет - и так нормально.


Vadikan 18-07-2005 21:51 342025

Вопрос мне в PM пришел
Цитата:

I like to integrate this great utility into a application build with Uniface, a 4GL toolbox. Therefor I need a dll-version of this program. I that possible? I'm not really into c++ and compiling stuff. Perhaps you can tell me how I can compile a dll-version

Savant 18-07-2005 22:03 342029

Вложений: 1
Possible. =)
И даже проще, чем обычный вариант. Не надо командную строку разбирать ;) Правда код придется новый катать. Предлагаю такой прототип:
Код:

// Возвращает 0, если все ОК и не-0, если ошибка
int RunHiddenConsole(char* lpszCmdLine, BOOL bWait);

Добавлено:
В принципе все готово, но еще не проверял. А мне утром доверять нельзя ;]

Млин, во вложении почему-то оказался hidec[1].dll - на самом дело это зип-архив. Не верьте расширению!

Updated!
Добавил тестовое приложение. Кое-что подправил.

SyCraft 20-12-2005 10:51 384975

Ух ну а все таки, где взять последнюю версию бинарника
и каков его синтаксис?

Savant 20-12-2005 18:47 385151

На первой странице, либо здесь

SyCraft 22-12-2005 09:39 385724

Savant
А синтпксис каков, ибо я так понел сам код притерпел модификации и хотелось бы уточнить синтаксис командной строки

SergeCpp 22-12-2005 12:37 385797

Друзья!

А если использовать

CreateWindowStation
SetProcessWindowStation

то пусть они все свои окна и открывают...

но в другой Station...

её же не видно...

MSDN, короче...

pva 22-12-2005 13:25 385826

Когда мне нужно было скрыть консоль - я делал ShowWindow(..., SW_HIDE);
Вроде игры с настройками ярлыков помогали.

domo22 13-06-2009 11:34 1142186

Что-то ссылка на hidec.exe ( http://hasherfrog.narod.ru/RunHiddenConsole.exe ) битая.

Vadikan 13-06-2009 23:16 1142631

domo22, см. Скрытие консольных окон

Drongo 13-06-2009 23:33 1142647

domo22, Ещё вариант - Как скрыть окно в котором выполняется пакетный файл (*.bat или *.cmd)?

korsar77 04-08-2009 13:21 1185194

Drongo, Прчел много и перепробовал на тему Как скрыть окно в котором выполняется пакетный файл (*.bat или *.cmd)? Ответа не нашел .Подскажите: без помощи дополнительных программ не реально запустить start.cmd для форматирования диска без окна консоли?
Код:

@ ECHO OFF  format M: /FS:FAT32 /Y  cmdow @ / HID  del start.cmd

Drongo 04-08-2009 14:20 1185263

Цитата:

Цитата korsar77
перепробовал на тему Как скрыть окно в котором выполняется пакетный файл (*.bat или *.cmd)? Ответа не нашел »

Ну как же? Скачиваете Bat To Exe Converter устанавливаете настройки создания в соответствии с комментарием 29. Устанавливаем переключатель в положение Invisible application и всё, создаём исполнимый файл, но в этом случае не должно быть команд на паузы или запросов с взаимодействием с пользователем (окно ведь будет скрыто)



А так же тема - [решено] Как скрыть консольное окно? -> Скрытие консольных окон

korsar77 04-08-2009 14:36 1185278

Drongo, Большо спасибо!!! Все получилось.Каюсь виной всему моя невнимательность

korsar77 04-08-2009 18:30 1185523

Drongo, Не пойму в чем дело сейчас попробЫвал- опять выскакивает окно .Может что нета пишу

Drongo 04-08-2009 20:14 1185583

korsar77, Ваш скрипт вроде бы взаимодействует с пользователем, просит нажать на клавишу "Y". Приведите ваш скрипт целиком.
И главное.
Цитата:

Цитата korsar77
Не пойму в чем дело сейчас попробЫвал- опять выскакивает окно .Может что нета пишу »

Я не знаю, что вы пишите и делаете, вы этого нам не говорите. :) Может что-то не то. Подробно опишите последовательность ваших действий.

korsar77 04-08-2009 20:21 1185590

Drongo,
Код:

@echo off  start FORMAT M:  del start.cmd
и призапуске cmd. выскакивает это окно

Drongo 26-08-2009 13:09 1203669

korsar77, Мне кажется, ничего в этом случае не выйдет, так как при выполнении этого батника, происходит запуск ещё консольной программы по форматированию - format.com

korsar77 26-08-2009 20:24 1204045

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

Drongo 27-08-2009 12:26 1204531

Цитата:

Цитата korsar77
Вы можете предложить варианты для решения непосредственно для форматирования ? »

Нет, к сожалению у меня решений нет. :dont-know

apozlevich 17-10-2011 21:20 1775626

Цитата:

Цитата hasherfrog
Q. А есть ли бинарник?
A. Есть. Тут пока лежит. »

Лежит, да. Сайт лежит.

Цитата:

Внимание: последний ответ в эту тему был добавлен более чем 2 Лет назад
Снова я некропосчу...

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

Wu-Tang 01-10-2014 23:59 2409723

Vadikan,
перечитал ваши посты и коллег в этой теме, также заинтересовало скрытие из guirunonce, вобщем правильно ли я сделал, использую hidcon, его положил в - oem - $$ - system32
в winnt.sif
[GuiRunOnce]
Command0="hidcon %windir%\Tweaks.cmd"

все правильно?

и самое интересное, скрытие окон из cmdlines, я так понял не решилось?
тк hidcon там не прокатывает.

Vebserfer 28-07-2015 10:52 2533278

Кто нибудь пробовал скрыть консоль в Windows 10? Утилиты hidec и hidcon в ней не работают, как и сторонние программы для скрытия консоли, теоретически скрыть консоль в Windows 10 можно, но передать команду выполнения на срытую таким образом консоль или выполнить bat или cmd файл через указанные утилиты невозможно.

Vebserfer 03-08-2015 20:59 2536429

Прошу извинения за предыдущее сообщение, утилиты hidec и hidcon прекрасно работают в Windows 10, проблема как оказалось заключалась исключительно в антивирусе Dr.Web после его установки в Windows 10, указанные утилиты как и некоторые системные настройки отказались правильно работать http://forum.drweb.com/index.php?sho...069&hl=windows

Drongo 05-08-2015 10:17 2537197

Vebserfer, Привет, я делал так, без сторонних программ типа hidcon, hidec, правда не в 10-ке, проверьте у себя, интересен результат.

Файл .cpp
Код:

...
// Скрытие консольного окна--------------------------------------------------
void __fastcall TForm1::RunWaitHide(AnsiString EXEFILE)
{
  char* command = EXEFILE.c_str();
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  si.wShowWindow = SW_HIDE; //вот тут то мы и скроем окно программы
  si.dwFlags = STARTF_USESHOWWINDOW; //вот та строчка, которую я забыл дописать:)
  ZeroMemory( &pi, sizeof(pi) );
  if(CreateProcess(NULL, command, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)){
      WaitForSingleObject(pi.hProcess, INFINITE);
    }
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread  );
}
// Формируем сценарный файл с выбранными командами---------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  String Res = "gui_nmar.cmd"; // кмдшник, так же можно передать ключи к нему
  RunWaitHide(Res);
}
...

Файл .h
Код:

...
private:        // User declarations
  void __fastcall RunWaitHide(AnsiString exefile);
...


sNc-DAntES 03-10-2015 22:34 2560426

Доброго времени суток. А кто нибудь может подсказать, почему программа выполняет не всю строку? Есть CMD файл, который делает резервную копию некоторых программ:
Скрытый текст
Код:

7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Kodi_%date%.7z" "%APPDATA%\Kodi\" && 7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\XBMC_Main_%date%.7z" "d:\Xbmc 13.6\" && 7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Bittorrent_%date%.7z" "%APPDATA%\BitTorrent\"


Если в Планировщике Заданий создать задачу по запуску:
Код:

hidec.exe Kodi_arc.cmd
То выполнится только первая часть команды до символов &&. Если же запустить CMD файл двойным кликом, или из того же Планировщика Задач, то выполняются все команды. Что можно сделать, чтобы и окно консоли не мешало пользователю и выполнялись все команды? Желательно, чтобы всё это можно решить только одной задачей в Планировщике, а не создавать отдельные задачи, для каждой команды. Спасибо.

Iska 03-10-2015 23:00 2560436

sNc-DAntES, для чего там вообще нужны «&&»?!

Цитата:

Цитата sNc-DAntES
Что можно сделать, чтобы и окно консоли не мешало пользователю и выполнялись все команды? »

Использовать WSH вместо пакетного файла.

sNc-DAntES 04-10-2015 12:36 2560506

Цитата:

Цитата Iska
sNc-DAntES, для чего там вообще нужны «&&»?! »

Чтобы команды выполнялись одна за другой.
Цитата:

Цитата Iska
Использовать WSH вместо пакетного файла. »

К сожалению в программировании не разбираюсь.

Iska 04-10-2015 13:31 2560518

Цитата:

Цитата sNc-DAntES
Чтобы команды выполнялись одна за другой. »

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

7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Kodi_%date%.7z"      "%APPDATA%\Kodi\"
7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\XBMC_Main_%date%.7z"  "d:\Xbmc 13.6\"
7z a -ssw -mx9 -mmt=on -ms=on -y "d:\Install\!BackUp\Bittorrent_%date%.7z" "%APPDATA%\BitTorrent\"

что вполне приемлемо при использовании пакетного файла.

Для совмещения нескольких команд в одной строке применяется один амперсанд «&», а использованный Вами «&&» используется для условного исполнения команд: последующая команда исполняется в том, и только в том случае, если предыдущая вернёт ненулевой код возврата.

sNc-DAntES 04-10-2015 23:38 2560651

Iska, да, большое спасибо. Значит это я тормоз и всё забыл. Теперь через
Код:

hidec.exe Kodi_arc.cmd
Выполняются все три команды последовательно.

Taciturn 11-10-2015 13:16 2562697

Скомпилируйте, пожалуйста, 64-битную версию.

wiznv 28-12-2015 08:12 2588973

Цитата:

Цитата hasherfrog
Данная малюсенькая прога призвана решить проблему, описанную здесь. »

большое спасибо! Давно искал решения для работы с robocopy! Супер!
А вы можете подсказать код который будет запускать тОлько robocopy.exe ? Подобная программа потенциально опасна т.к. может скрыть работу какой либо вредоносной программы, и поэтому хотелось бы адаптировать ее под определенную программу ( robocopy.exe - стандартная программа в windows 7, лежит в папке system32 ) т.е. ограничить..

Iska 28-12-2015 11:33 2589029

wiznv, к сожалению, коллега hasherfrog три года, как не появлялся на форуме. Напишите ему письмо на почту (ссылка доступна из его профиля).


Время: 01:38.

Время: 01:38.
© OSzone.net 2001-