CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Аватара пользователя
Nun-Nun

CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Nun-Nun »

При деинсталляции программы из Inf-файла запускается батник: CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"

Содержимое батника:



Код:

Код: Выделить всё

@Echo Off
SetLocal EnableDelayedExpansion
Set InstPath=%SystemDrive%\My_Program
Set sw="HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
For /F "tokens=2*" %%j In ('Reg Query %sw% /v Path ^| Find /I "Path"') Do Set type=%%j& Set curpath=%%k
Echo "%curpath%" | Find /I "%InstPath%" >Nul && Goto _Del
If /I %~1#==Del# Pause>Nul & Exit
Reg Add %sw% /v Path /t %type% /d "%curpath%;%InstPath%" /f
nircmdc sysrefresh environment
Exit
:_Del
If /I %~1#==Add# Pause>Nul & Exit
Reg Add %sw% /v Path /t %type% /d "!curpath:;%InstPath%=!" /f
nircmdc sysrefresh environment
Exit

Всё прекрасно отрабатывает, но во время деинсталляции ненадолго появляется консольное окно (насколько понимаю, из-за команды: Echo "%curpath%" | Find /I "%InstPath%" >Nul && Goto _Del[/i] ). Недостаток чисто косметический, но убрать хотелось бы (желательно, не ломая рабочую конструкцию).
Аватара пользователя
Foreigner

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Foreigner »

Если используется nircmd, то можно так (пример)



Код:

Код: Выделить всё

@echo off
title mybatch
nircmdc win hide title "mybatch"
timeout /t 5
nircmdc win show title "mybatch"
pause
Аватара пользователя
Nun-Nun

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Nun-Nun »

Foreigner,



Честно говоря, не понял как это может сработать. Если прописываю это в самом батнике, то бесполезно, т.к. команда Echo вызовет консольное окно и оно хотя и малозаметно, но всё равно мелькнёт. Если это должно быть в inf-е

Код:

Код: Выделить всё

title mybatch
nircmdc win hide title "mybatch"

, то не представляю как это туда запихать, это ж не батник. Изображение
Аватара пользователя
Iska

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Iska »

Окно консоли порождает сам процесс cmd.exe, безо всякой связи с наличием/отсутствием «echo».




Цитата Nun-Nun:



При деинсталляции программы из Inf-файла запускается батник: CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"
CMD/BAT - Скрыть консольное окно, не ломая конструкцию




Вместо запуска пакетного файла:



Код:

Код: Выделить всё

CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"

используйте вызов «nircmd.exe», например, с командой
execmd
, которой передавайте в качестве параметра Ваш пакетный файл.
Аватара пользователя
Nun-Nun

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Nun-Nun »

Iska,



Не всё так просто, как хотелось бы. Как оказалось проблема несколько сложнее. Изначально в inf-файле запускается три процесса с cmd.exe:



Код:

Код: Выделить всё

[PNF.Files]
CMD.exe /c "Del /q /f %17%\%NAME_INF%.pnf"
CMD.exe /c "Del /q /f %17%\%NAME_INF%.inf"
[PROG.DelSetPath]
CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"

Замена CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"[/i] на "%24%\%PROG_DIR%\NirCMDc.exe" execmd "%24%\%PROG_DIR%\SetPath.cmd" решается легко, а вот с двумя другими аналогичный фокус не проходит, т.к. NirCMDc.exe входит в комплект удаляемой программы и удаляется вместе со всеми остальными компонентами при деинсталляции.



Код:

Код: Выделить всё

"%24%\%PROG_DIR%\NirCMDc.exe" execmd Del /q /f "%17%\%NAME_INF%.pnf"
"%24%\%PROG_DIR%\NirCMDc.exe" execmd Del /q /f "%17%\%NAME_INF%.inf"

В итоге, во-первых, появляется сообщение о том, что NirCMDc.exe не найден (что и не удивительно), во-вторых inf- и pnf-файл остаются неудалёнными. Тут, насколько вижу, нужно ломать организацию всего inf-а, чего делать не хотелось бы, т.к. полезут другие проблемы.
Аватара пользователя
Iska

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Iska »

Nun-Nun, во-первых, не «nircmdc.exe», а «nircmd.exe». «nircmdc.exe» — как раз консольная версия утилиты. Во-вторых — помещайте его в «%SystemRoot%» при установке и не удаляйте впоследствии. Третий путь, если таки хотите держать его в папке приложения — «PendMoves»: задать удаление файла «nircmd.exe» и удаление папки не тотчас же, а при очередной перезагрузке.
Аватара пользователя
gora

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение gora »

Nun-Nun, для удаления файлов нет необходимости использовать батник, inf файлы это умеют сами, без сторонних утилит.
Удаление файлов и директорий


Для скрытия окон в inf файле есть флаги.
Последовательное выполнение списка команд (AdvancedINF)




Руководство по работе с INF-файлами
Аватара пользователя
Nun-Nun

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение Nun-Nun »

Цитата gora:



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

...Для скрытия окон в inf файле есть флаги...
CMD/BAT - Скрыть консольное окно, не ломая конструкцию




Благодарю, я знаю об этом. Первоначально так и было сделано, но почему-то при деинсталляции не удалялся pnf-файл, что-то в системе его держало, поэтому и пришлось городить огород с cmd.exe.


Цитата Iska:



Во-вторых — помещайте его в «%SystemRoot%» при установке и не удаляйте впоследствии.
CMD/BAT - Скрыть консольное окно, не ломая конструкцию




Об этом я тоже думал. Конечно на своём ПК это допустимо, а на чужих как-то не красиво.


Цитата Iska:



Третий путь, если таки хотите держать его в папке приложения — «PendMoves»: задать удаление файла «nircmd.exe» и удаление папки не тотчас же, а при очередной перезагрузке.
CMD/BAT - Скрыть консольное окно, не ломая конструкцию




Как раз над этим сейчас и думаю. Спасибо.
Аватара пользователя
gora

Re: CMD/BAT - Скрыть консольное окно, не ломая конструкцию

Сообщение gora »

Nun-Nun, батник можно запаковать в hide SFX с использованием "маленьких" модулей (SetTools), размер будет даже меньше чем у nircmd.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»