Показать полную графическую версию : [решено] Батник дописывает сам себя
Заинтересовался вопросом, как сделать так, чтобы батник сам себя проверял и дописывал (стирал) при условии наличия файлов. Как записать переменную исполняемого батника? Типа накидал файлов, запустил скрит. Он сам себя собрал и начал установку. :)
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
сам себя проверял и дописывал (стирал) »
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. Но он может создать второй батник и в конце запустить его (второй батник) из первого.
Стереть сам себя может, добавьте в самый конец батника: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
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. »раз может стереть, значит может и дописать, но только в конец батника:
@echo off
echo 001
echo 002
(
echo echo ---
echo echo 003
echo echo 004
echo pause
)>>"%~f0"
rem.
Решил пойти по пути создания установочного файла. Подскажите, как через ECHO записать переменную. Пробовал так, не получается.
>>"Inst.cmd" Echo Del "%~0"
>>"Inst.cmd" Echo Del "%%~0"
Ещё вопрос. Как через Echo записать 2>Nul
>>"Inst.cmd" Echo 2>Nul RD /S/Q "%%WinDir%%\TEMP"
>>"Inst.cmd" Echo 2^>Nul RD /S/Q "%%WinDir%%\TEMP"
Foreigner
16-05-2011, 20:33
sov44,
echo 2^>nul
Не получается записать %%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"
Не получается записать %%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
Хочу улучшить скрипт установки обновлений, записывая в одно 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%
записывая в одно 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
gora, в том то и дело, что оба цикла должны работать одновременно: один записывает в Echo полное имя msp, а второй только значение КВ.
И так дальше, дописывая Echo, перебирая все msp. Именно это и не получается. :(
А так?@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.
)
А так? »
не подойдёт, т.к. %%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%
Решение похоже нашел
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%
@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.
)
)
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.
)
@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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.