Показать полную графическую версию : Скрыть консольное окно, не ломая конструкцию
При деинсталляции программы из 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 ). Недостаток чисто косметический, но убрать хотелось бы (желательно, не ломая рабочую конструкцию).
Foreigner
29-04-2013, 23:17
Если используется nircmd, то можно так (пример)
@echo off
title mybatch
nircmdc win hide title "mybatch"
timeout /t 5
nircmdc win show title "mybatch"
pause
Foreigner,
Честно говоря, не понял как это может сработать. Если прописываю это в самом батнике, то бесполезно, т.к. команда Echo вызовет консольное окно и оно хотя и малозаметно, но всё равно мелькнёт. Если это должно быть в inf-е title mybatch
nircmdc win hide title "mybatch", то не представляю как это туда запихать, это ж не батник. :(
Окно консоли порождает сам процесс cmd.exe, безо всякой связи с наличием/отсутствием «echo».
При деинсталляции программы из Inf-файла запускается батник: CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del" »
Вместо запуска пакетного файла:
CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"
используйте вызов «nircmd.exe», например, с командой execmd (http://nircmd.nirsoft.net/execmd.html), которой передавайте в качестве параметра Ваш пакетный файл.
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" на "%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-а, чего делать не хотелось бы, т.к. полезут другие проблемы.
Nun-Nun, во-первых, не «nircmdc.exe», а «nircmd.exe». «nircmdc.exe» — как раз консольная версия утилиты. Во-вторых — помещайте его в «%SystemRoot%» при установке и не удаляйте впоследствии. Третий путь, если таки хотите держать его в папке приложения — «PendMoves»: задать удаление файла «nircmd.exe» и удаление папки не тотчас же, а при очередной перезагрузке.
Nun-Nun, для удаления файлов нет необходимости использовать батник, inf файлы это умеют сами, без сторонних утилит. Удаление файлов и директорий (http://www.oszone.net/3827#cpf5)
Для скрытия окон в inf файле есть флаги. Последовательное выполнение списка команд (AdvancedINF) (http://www.oszone.net/3827#exe)
Руководство по работе с INF-файлами (http://www.oszone.net/3827)
То-то ж, не пользуешься — не знаешь :(.
для удаления файлов нет необходимости использовать батник, inf файлы это умеют сами, без сторонних утилит...
...Для скрытия окон в inf файле есть флаги...»
Благодарю, я знаю об этом. Первоначально так и было сделано, но почему-то при деинсталляции не удалялся pnf-файл, что-то в системе его держало, поэтому и пришлось городить огород с cmd.exe.
Во-вторых — помещайте его в «%SystemRoot%» при установке и не удаляйте впоследствии.»
Об этом я тоже думал. Конечно на своём ПК это допустимо, а на чужих как-то не красиво.
Третий путь, если таки хотите держать его в папке приложения — «PendMoves»: задать удаление файла «nircmd.exe» и удаление папки не тотчас же, а при очередной перезагрузке.»
Как раз над этим сейчас и думаю. Спасибо.
Nun-Nun, батник можно запаковать в hide SFX с использованием "маленьких" модулей (SetTools), размер будет даже меньше чем у nircmd.
Конечно с удовольствием воспользуюсь Вашим предложением, но я не в курсе "маленьких" модулей (SetTools). Поясните, если не сложно, что это и где можно раздобыть.
SetTools (http://forum.oszone.net/thread-172130.html)
12. Конвертирование bat\cmd файлов в exe формат
См. Можно "вложить" bat'ник в exe'шник (http://forum.oszone.net/post-2138370-6.html)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.