Войти

Показать полную графическую версию : [решено] Батник дописывает сам себя


Страниц : [1] 2

sov44
15-05-2011, 19:47
Заинтересовался вопросом, как сделать так, чтобы батник сам себя проверял и дописывал (стирал) при условии наличия файлов. Как записать переменную исполняемого батника? Типа накидал файлов, запустил скрит. Он сам себя собрал и начал установку. :)

Set Cnt=0
For %%I In (*.msp) Do (
echo %%I
Set /A Cnt += 1
> txt.txt start /wait msiexec /update %%I /qb-^^!
> txt.txt Set /a cntA += 1
> txt.txt ECHO Установка обновления !cntA! завершена
)
Echo Количество обновлений - %Cnt%
pause

gora
15-05-2011, 19:59
сам себя проверял и дописывал (стирал) »
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. Но он может создать второй батник и в конце запустить его (второй батник) из первого.
Стереть сам себя может, добавьте в самый конец батника:Del "%~0"

Foreigner
15-05-2011, 20:29
Весь вопрос только как самого себя перезаписывать. Вариант с помощью gsar (http://gnuwin32.sourceforge.net/packages/gsar.htm):

@echo off
setlocal

set "cnt=0"
set "seek=%cnt%"

echo %cnt%

set /a cnt+=1
1>nul gsar -s"cnt=%seek%" -r"cnt=%cnt%" -o %~nx0

amel27
16-05-2011, 03:26
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. »раз может стереть, значит может и дописать, но только в конец батника:
@echo off

echo 001
echo 002
(
echo echo ---
echo echo 003
echo echo 004
echo pause
)>>"%~f0"
rem.

sov44
16-05-2011, 19:38
Решил пойти по пути создания установочного файла. Подскажите, как через ECHO записать переменную. Пробовал так, не получается.

>>"Inst.cmd" Echo Del "%~0"

gora
16-05-2011, 19:41
>>"Inst.cmd" Echo Del "%%~0"

sov44
16-05-2011, 20:30
Ещё вопрос. Как через Echo записать 2>Nul

>>"Inst.cmd" Echo 2>Nul RD /S/Q "%%WinDir%%\TEMP"

gora
16-05-2011, 20:33
>>"Inst.cmd" Echo 2^>Nul RD /S/Q "%%WinDir%%\TEMP"

Foreigner
16-05-2011, 20:33
sov44,

echo 2^>nul

sov44
16-05-2011, 22:20
Не получается записать %%I
>>"Inst.cmd" Echo For %%I In (*.msp) Do Set /A Cnt += 1
Как сделать, чтобы в конце скрипта появлялся запрос на запуск вновь созданного батника, типа "Начать установку" Да / Нет , желательно через MsgBox.vbs


Нашел, как вывести 2 кнопки. Как сделать по умолчанию кнопку "Нет" и присвоить кнопкам действие?

@echo off &chcp 1251 >nul
echo Set Args = WScript.Arguments> "%temp%\MsgBox.vbs"
echo MsgBox Args(0), vbYesNo, Args(1)>> "%temp%\MsgBox.vbs"
"%temp%\MsgBox.vbs" "Установить обновления?" "пример"
del /q "%temp%\MsgBox.vbs"

amel27
17-05-2011, 05:08
Не получается записать %%I »
>>"Inst.cmd" Echo For %%%%I In (*.msp) Do Set /A Cnt += 1

Как сделать по умолчанию кнопку "Нет" и присвоить кнопкам действие? »
@echo off
echo WScript.Quit(MsgBox(WScript.Arguments(0),vbYesNo+vbDefaultButton2,WScript.Arguments(1)))>"%temp%\MsgBox.vbs"
WScript "%temp%\MsgBox.vbs" "Установить обновления?" "пример"
If %ERRORLEVEL% equ 6 (echo Выбрана установка обновлений.) else (
echo Получен отказ от установки обновлений.)
del /q "%temp%\MsgBox.vbs"

pause>nul

sov44
04-07-2011, 21:44
Хочу улучшить скрипт установки обновлений, записывая в одно Echo одно и тоже данное из двух циклов. Не получается.

for /f "delims=-." %%a in ('dir/b/a-d kb*.msp') do (
set nam=%%a
For %%I In (*.msp) Do (
>>"Inst.cmd" Echo start /wait msiexec /update %%I /qb-!
>>"Inst.cmd" Echo Set /a i+= 1
>>"Inst.cmd" Echo ECHO Установка обновления !nam! завершена - %%i%%
>>"Inst.cmd" Echo.
)
)

в Inst.cmd должно получиться так:

start /wait msiexec /update KB2288613-usp10-rus.msp /qb-
Set /a i+= 1
ECHO Установка обновления KB2288613 завершена - %i%

gora
04-07-2011, 22:17
записывая в одно Echo одно и тоже данное из двух циклов »
Данное не одно и тоже по Вашему скрипту.
Вот что получится, если в папке лежат: KB2416472.msp, KB2473228.msp, NDP40-KB2478663.msp
start /wait msiexec /update KB2416472.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2416472 завершена - %i%

start /wait msiexec /update KB2473228.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2416472 завершена - %i%

start /wait msiexec /update NDP40-KB2478663.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2416472 завершена - %i%

start /wait msiexec /update KB2416472.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2473228 завершена - %i%

start /wait msiexec /update KB2473228.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2473228 завершена - %i%

start /wait msiexec /update NDP40-KB2478663.msp /qb-!
Set /a i+= 1
ECHO Установка обновления KB2473228 завершена - %i%
В вашем коде !nam! просто заменил на %%a

sov44
04-07-2011, 22:31
gora, в том то и дело, что оба цикла должны работать одновременно: один записывает в Echo полное имя msp, а второй только значение КВ.
И так дальше, дописывая Echo, перебирая все msp. Именно это и не получается. :(

gora
04-07-2011, 22:38
А так?@Echo Off
for /f "delims=-" %%a in ('dir/b/a-d kb*.msp') do (
>>"Inst.cmd" Echo start /wait msiexec /update %%a /qb-!
>>"Inst.cmd" Echo Set /a i+= 1
>>"Inst.cmd" Echo ECHO Установка обновления %%~na завершена - %%i%%
>>"Inst.cmd" Echo.
)

sov44
04-07-2011, 22:59
А так? »
не подойдёт, т.к. %%a в Inst.cmd равна %%~na

start /wait msiexec /update KB2289163 /qb-
Set /a i+= 1
ECHO Установка обновления KB2289163 завершена - %i%

Должно быть типа

start /wait msiexec /update KB2288613-usp10-rus.msp /qb-
Set /a i+= 1
ECHO Установка обновления KB2289163 завершена - %i%

sov44
04-07-2011, 23:58
Решение похоже нашел

For %%I In (*.msp) Do (
set nam=%%I
>>"Inst.cmd" Echo start /wait msiexec /update !nam! /qb-!
>>"Inst.cmd" Echo Set /a i+= 1
>>"Inst.cmd" Echo ECHO Установка обновления KB!nam:~2,7! завершена - %%i%%
>>"Inst.cmd" Echo.
)
однако не могу додумать, как убрать дефис после имени длиной менее 9 знаков.

start /wait msiexec /update KB924423-v2-outlhol-rus.msp /qb-
Set /a i+= 1
ECHO Установка обновления KB924423- завершена - %i%

gora
05-07-2011, 08:06
@Echo Off
SetLocal EnableDelayedExpansion
For %%I In (*.msp) Do (
Set nam=%%~nI
Rem отрезаем от имени без расширения все, что может быть до KB (например, Windows6.1-KB2511455-x86.msp)
Set nam=!nam:*KB=KB!
Rem теперь KB у нас первое, делим имя по разделителю '-' и берем только первую часть
For /f "delims=-" %%a In ("!nam!") Do (
>>"Inst.cmd" Echo start /wait msiexec /update %%I /qb-^^!
>>"Inst.cmd" Echo Set /a i+= 1
>>"Inst.cmd" Echo ECHO Установка обновления %%a завершена - %%i%%
>>"Inst.cmd" Echo.
)
)

sov44
05-07-2011, 19:31
gora, всё работает как надо!
Прошу помочь с альтернативным вариантом написания скрипта с убиранием дефиса из имени длиной менее 9 символов ( до КВ никаких символов нет ). Скрипт не работает.

@echo off
del/f Inst1.cmd
For %%I In (*.msp) Do (
set nam=%%I

if %nam:~0,9%==%nam:~0,8%- set rrr=%nam:~0,8% else rrr=%nam:~0,9%

>>"Inst1.cmd" Echo start /wait msiexec /update !nam! /qb-^^!
>>"Inst1.cmd" Echo Set /a i+= 1
>>"Inst1.cmd" Echo ECHO Установка обновления !rrr! завершена - %%i%%
>>"Inst1.cmd" Echo.
)

gora
05-07-2011, 20:12
@Echo Off
SetLocal EnableDelayedExpansion
del /f /Q Inst1.cmd
For %%I In (*.msp) Do (
set nam=%%~nI
if "!nam:~0,9!"=="!nam:~0,8!-" (set rrr=!nam:~0,8!) else set rrr=!nam:~0,9!
>>"Inst1.cmd" Echo start /wait msiexec /update %%I /qb-^^!
>>"Inst1.cmd" Echo Set /a i+= 1
>>"Inst1.cmd" Echo ECHO Установка обновления !rrr! завершена - %%i%%
>>"Inst1.cmd" Echo.
)




© OSzone.net 2001-2012