Войти

Показать полную графическую версию : CMD не хочет убивать сам себя.


Grenky
30-06-2005, 08:23
Значит так!
При установке я выбираю в BCDW нужный мне способ установки
[MenuItems]
\i386\setupldr.bin
и соответственно выбирается свой winnt.sif в котором есть строка
[GUIRunOnce]
command1 = "%SystemDrive%\Install\COMPANY1.cmd"
Которая как видно запускает мой файл COMPANY1.cmd. В нем как раз и содержатся лишь то что надо установить лишь для конкретного winnt.sif.
(а в RunOnceEx.cmd ставятся стандарные для всех установак приложения)
Вот его содержание:

cmdow @ /HID
@echo off

FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) DO IF EXIST %%d:\WIN51 SET CDROM=%%d:

START /WAIT %CDROM%\install\sav\COMPANY1.exe
START /WAIT %CDROM%\install\sav\sav.exe
START /WAIT %systemdrive%\Install\SAV\SAV.msi /QN RUNLIVEUPDATE=0 REBOOT=ReallySuppress
START /WAIT %systemdrive%\Cleanup.cmd
EXIT


В нем мы сначала ищем CD (другой способ не приемлем, т.к. файл запускается не с компакт диска), запускаем два ЕХЕ-шника (первый распаковывает необходимый для нас GRC.DAT для нашей COMPANY1, а второй распаковывает архив с SAV), устанавливаем SAV-антивирус. Далее запускается чистельщик Cleanup.cmd с таким кодом :

cmdow @ /HID

RD /S /Q %systemdrive%\Install\
erase cleanup.cmd /s /q
del cleanup.cmd /s /q
EXIT

Так вот он папку убивает, а себя не хочит. Erase и Del использовал вместе ради эксперимента, но :o нет реакции.

Ваши советы.



ЗЫ: Зачам такой изврат? А чтоб избавиться от необходимости выбора нужного GRC.DAT при установке. А точнее избавиться от мною придуманного способа. Идея лежит тут -
http://forum.oszone.net/showthread.php?p=36690#post36690 :o

D@nil
30-06-2005, 08:57
1.cmdow @ /HID
@echo off
FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) DO IF EXIST %%d:\WIN51 SET CDROM=%%d:
START /WAIT %CDROM%\install\sav\COMPANY1.exe
START /WAIT %CDROM%\install\sav\sav.exe
START /WAIT %systemdrive%\Install\SAV\SAV.msi /QN RUNLIVEUPDATE=0 REBOOT=ReallySuppress
RD /S /Q %systemdrive%\Install\
EXIT
Или
2.cmdow @ /HID
@echo off
FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) DO IF EXIST %%d:\WIN51 SET CDROM=%%d:
START /WAIT %CDROM%\install\sav\COMPANY1.exe
START /WAIT %CDROM%\install\sav\sav.exe
START /WAIT %systemdrive%\Install\SAV\SAV.msi /QN RUNLIVEUPDATE=0 REBOOT=ReallySuppress
START /WAIT %systemdrive%\Cleanup.cmd
del %systemdrive%\cleanup.cmd /s /q
EXIT и cmdow @ /HID
RD /S /Q %systemdrive%\Install\
EXIT
Имхо первый вариант удобнее

Grenky
30-06-2005, 09:14
Пробую.
Но есть еще и вариант когда нужно из winnt.sif просто запустить cleanup.cmd с
cmdow @ /HID
RD /S /Q %systemdrive%\Install\
EXIT
например когда SAV устанавливать нет необходиимости, а папочку install убить необходимо
Мой вариант:
winnt.sif
[GUIRunOnce]
command1 = "%SystemDrive%\Cleanup.cmd"
Тогда опять тупик.

Vadikan
30-06-2005, 09:31
Grenky
DEL %0

Petya V4sechkin
30-06-2005, 09:32
Grenky
и соответственно выбирается свой winnt.sif в котором есть строка

[GUIRunOnce]
command1 = "%SystemDrive%\Install\COMPANY1.cmd"

Попробуй так:

[GUIRunOnce]
command1 = "%SystemDrive%\Install\COMPANY1.cmd"
command2 = "%SystemRoot%\system32\Cmd.exe /C RD /S /Q %SystemDrive%\Install\"

Grenky
30-06-2005, 09:47
Petya V4sechkin
[GUIRunOnce]
command2 = "%SystemRoot%\system32\Cmd.exe /C RD /S /Q %SystemDrive%\Install\" - это интересно
Vadikan
DEL %0
объясни что за параметр такой

Vadikan
30-06-2005, 09:57
Grenky
Сорри, я ветку целиком не читал, а только название. Просто сделай эту строку последней в файле. Тестовый файл

@echo off
echo testing the file
pause
DEL %0

Grenky
30-06-2005, 10:11
Vadikan хоть ты и не объяснил но пологаю что %О есть сам файл. Т.е. сокращенный вариант
del cleanup.cmd /s /q
или я не прав
если прав то такое не прокатило.

Vadikan
30-06-2005, 10:37
Grenky
Ну да, это сам файл. Только не О а 0 (ноль). Ты мой код сохрани как test.bat и запусти. Все работает.

Grenky
30-06-2005, 10:52
Vadikan работает и как я сказал, но только при тестах на установленной системе. А при непосредственной установке не работает.

видемо лучший вариант + нет дополнительного батника это.
При варианте когда надо установить SAV

winnt.sif:

[GUIRunOnce]
command1 = "%SystemDrive%\Install\COMPANY1.cmd"

COMPANY1.cmd:

cmdow @ /HID
@echo off
FOR %%d IN (c d e f g h i j k l m n o p q r s t u v w x y z) DO IF EXIST %%d:\WIN51 SET CDROM=%%d:
START /WAIT %CDROM%\install\sav\COMPANY1.exe
START /WAIT %CDROM%\install\sav\sav.exe
START /WAIT %systemdrive%\Install\SAV\SAV.msi /QN RUNLIVEUPDATE=0 REBOOT=ReallySuppress
RD /S /Q %systemdrive%\Install\
EXIT
А если не надо то просто в winnt.sif:

[GUIRunOnce]
command1 = "%SystemRoot%\system32\Cmd.exe /C RD /S /Q %SystemDrive%\Install\"

и все.

ПыСы: Заметили скока Vadikan-а я не спрашивал про параметр %0 - молчит как партизан :)

Vadikan
30-06-2005, 11:03
Заметили скока Vadikan-а я не спрашивал про параметр %0 - молчит как партизанKxe, открываем командую строку и в ней печатаем FOR /? и идем до последнего блока документации. Или смотрим в этой ветке (http://forum.oszone.net/showthread.php?t=46182). Ну и напоследок, взято из темы на MSFN (http://www.msfn.org/board/index.php?showtopic=49617), она сейчас на самом верху

@Echo OFF
SetLocal enableextensions
CLS
Echo.
Echo I am file (not yet expanded): %0
Echo My Expanded File Name: %~n0
Echo My Expanded Extension: %~x0
Echo My Expanded Name and Extension: %~nx0
Echo My Expanded Drive: %~d0
Echo The Expanded Root of My Drive: %~d0\
Echo Some Other Expanded Path on My Drive: %~d0\SomeOtherPath
Echo My Expanded Path: %~p0
Echo My Expanded Drive and Path: %~dp0
Echo.
Pause

EndLocal
GoTo :EOF

Petya V4sechkin
30-06-2005, 11:05
Grenky
В твоем варианте директория Install не удалится, потому что файл COMPANY1.cmd в ней.

В секции GUIRunOnce можно указать несколько команд.
Поэтому я и предложил:
[GUIRunOnce]
command1 = "%SystemDrive%\Install\COMPANY1.cmd"
command2 = "%SystemRoot%\system32\Cmd.exe /C RD /S /Q %SystemDrive%\Install\"



Совершенно лишний пост.. На самом деле все прекрасно удаляется.. Нечаянно ввел в заблуждение Vadikan'а :)

Grenky
30-06-2005, 11:15
to Petya V4sechkin
Протестил... Удалился
В твоем варианте я не уверен что command2 будет ждать отработку command1.
Поправь если ошибаюсь.
to Vadikan
спасибо за разъяснение

Vadikan
30-06-2005, 11:18
Grenky
Нда, причина как раз и была в директория Install не удалится, потому что файл COMPANY1.cmd в ней.Ты же можешь cleanup.cmd в любую другую директорию поместить, хоть в %windir%\temp и оттуда уже запускать. Он и директорию Install удалит и сам себя потом. Я же сказал, что я ветку целиком не читал
LOL

Grenky
30-06-2005, 11:25
см. мой первый пост. Это первоначальный вариант:
START /WAIT %systemdrive%\Cleanup.cmd
он и так в корне.

протестил те варианты что описал здесь (http://forum.oszone.net/showthread.php?p=337159#post337159) все работает.

Vadikan
30-06-2005, 11:46
Grenky
Ладно, я выпил достаточно пива, чтобы об'яснить популярно :) Вместо START /WAIT %systemdrive%\Cleanup.cmd надо использовать CALL %systemdrive%\Cleanup.cmdТогда первый файл вызовет второй, а сам продолжит работу, т.е. закроется (вызываем-то мы последней командой). Тогда второму файлу ничего не помешает удалить директорию, содержащую первый файл, а потом и сам себя.

Конечно, протестировать GuiRunOnce я не могу, но только что проверил RunOnceEx. Итак, в %systemdrive%\test помещаем test1.cmd

cmdow @ /HID
@echo off

echo this is a line from the test1,cmd file >> %systemdrive%\file.txt
call %systemdrive%\test2.cmd

exit
В корень %systemdrive% кладем test2.cmd

cmdow @ /HID
@echo off

RD /S /Q %systemdrive%\test
DEL %0

exit

Создаем RunOnce.cmd

cmdow @ /HID
@echo off

SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx

REG ADD %KEY% /V TITLE /D "Bla-bla-bla" /f

REG ADD %KEY%\001 /VE /D "Bla-bla-bla" /f
REG ADD %KEY%\001 /V 1 /D "%systemdrive%\test1.cmd" /f

exit
запускаем его, выходим из системы и снова заходим. Папки %systemdrive%\test вместе с test1.cmd как не бывало. test2.cmd тоже исчез, зато есть %systemdrive%\file.txt, в котором одна строка, подтверждающая, что test1.cmd отработал.

Ваше здоровье :beer:

Grenky
30-06-2005, 12:33
хех нехотит слухать и все :)
я говорю всё работает Без кучи дополнительный cmd (см. выше)

Petya V4sechkin
30-06-2005, 14:15
Grenky
Теперь ясно, где собака порылась.
Изначально ошибка была в файле cleanup.cmd, строка "del cleanup.cmd" - естественно, ведь текущая директория совсем не %SystemDrive%. Поэтому и файл не удалялся.
А "del %0" замечательно работает, как и предлагал Vadikan.
И "rd /S /Q %systemdrive%\Install\" тоже прекрасно работает, даже из батника, который в этой же директории находится. Как и предлагал D@nil.
А я че-то затупил, извиняюсь :)




© OSzone.net 2001-2012