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

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

Nun-Nun 29-04-2013 23:04 2141968

Скрыть консольное окно, не ломая конструкцию
 
При деинсталляции программы из 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 2141972

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

@echo off

title mybatch
nircmdc win hide title "mybatch"

timeout /t 5

nircmdc win show title "mybatch"
pause


Nun-Nun 29-04-2013 23:40 2141981

Foreigner,

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

title mybatch
nircmdc win hide title "mybatch"

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

Iska 30-04-2013 09:24 2142098

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

Цитата:

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

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

CMD.exe /c "%24%\%PROG_DIR%\SetPath.cmd Del"
используйте вызов «nircmd.exe», например, с командой execmd, которой передавайте в качестве параметра Ваш пакетный файл.

Nun-Nun 30-04-2013 11:56 2142180

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-а, чего делать не хотелось бы, т.к. полезут другие проблемы.

Iska 30-04-2013 13:19 2142231

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

gora 30-04-2013 13:36 2142242

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

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

Iska 30-04-2013 13:56 2142262

То-то ж, не пользуешься — не знаешь :(.

Nun-Nun 30-04-2013 16:21 2142354

Цитата:

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

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

Цитата Iska
Во-вторых — помещайте его в «%SystemRoot%» при установке и не удаляйте впоследствии.»

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

Цитата Iska
Третий путь, если таки хотите держать его в папке приложения — «PendMoves»: задать удаление файла «nircmd.exe» и удаление папки не тотчас же, а при очередной перезагрузке.»

Как раз над этим сейчас и думаю. Спасибо.

gora 01-05-2013 16:46 2142881

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

Nun-Nun 02-05-2013 14:58 2143251

Конечно с удовольствием воспользуюсь Вашим предложением, но я не в курсе "маленьких" модулей (SetTools). Поясните, если не сложно, что это и где можно раздобыть.

gora 02-05-2013 15:11 2143264

SetTools
12. Конвертирование bat\cmd файлов в exe формат

Georgio 03-05-2013 01:56 2143524

См.


Время: 15:12.

Время: 15:12.
© OSzone.net 2001-