Батник дописывает сам себя
Заинтересовался вопросом, как сделать так, чтобы батник сам себя проверял и дописывал (стирал) при условии наличия файлов. Как записать переменную исполняемого батника? Типа накидал файлов, запустил скрит. Он сам себя собрал и начал установку. :)
Код:
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
|
Цитата:
Цитата sov44
сам себя проверял и дописывал (стирал) »
|
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. Но он может создать второй батник и в конце запустить его (второй батник) из первого.
Стереть сам себя может, добавьте в самый конец батника:
|
Весь вопрос только как самого себя перезаписывать. Вариант с помощью gsar:
Код:
@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
|
Цитата:
Цитата gora
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. »
|
раз может стереть, значит может и дописать, но только в конец батника:
Код:
@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"
|
Не получается записать %%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"
|
Цитата:
Цитата sov44
Не получается записать %%I »
|
Код:
>>"Inst.cmd" Echo For %%%%I In (*.msp) Do Set /A Cnt += 1
Цитата:
Цитата sov44
Как сделать по умолчанию кнопку "Нет" и присвоить кнопкам действие? »
|
Код:
@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%
|
Цитата:
Цитата sov44
записывая в одно 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.
)
|
Второй день ломаю голову, как записать в Inst.cmd
Код:
if !$i! equ 6 echo:!$s!& set "$s="& set/a $i=0
вроде все спецсимволы экранирую
Код:
>>"Inst.cmd" Echo if ^!^$i^! equ 6 echo:^!^$s^!^& set "^$s="^& set/a ^$i=0
но всё равно не получается как надо.
|
Запись зависит от SetLocal DisableDelayedExpansion\ EnableDelayedExpansion
Код:
SetLocal DisableDelayedExpansion
>>"Inst.cmd" Echo if !$i! equ 6 echo:!$s!^& set "$s="^& set/a $i=0
SetLocal EnableDelayedExpansion
>>"Inst.cmd" Echo if ^^!$i^^! equ 6 echo:^^!$s^^!^& set "$s="^& set/a $i=0
|
gora, ещё вопрос. Необходимо, чтобы в командной строке при запуске пересобранного батника отражалась надпись Внимание! с знаком восклицания в конце. Пробовал увеличивать число ^^^, но безрезультатно.
Код:
>>"Inst.cmd" Echo ECHO Внимание^^!
|
sov44, повторюсь:
Цитата:
Цитата gora
Запись зависит от SetLocal DisableDelayedExpansion\EnableDelayedExpansion »
|
При чем как в первом батнике так и во втором, создаваемом.
Думаю разберетесь на примере:
Код:
@Echo Off
Del "Inst.cmd"
SetLocal DisableDelayedExpansion
>>"Inst.cmd" Echo SetLocal DisableDelayedExpansion
>>"Inst.cmd" Echo ECHO Внимание!
ECHO Внимание!
SetLocal EnableDelayedExpansion
>>"Inst.cmd" Echo SetLocal EnableDelayedExpansion
>>"Inst.cmd" Echo ECHO Внимание^^^^^^^^^^!
ECHO Внимание^^!
pause
|
Время: 22:07.
© OSzone.net 2001-