Компьютерный форум 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=206918)

sov44 15-05-2011 19:47 1676843

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

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 1676850

Цитата:

Цитата sov44
сам себя проверял и дописывал (стирал) »

Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. Но он может создать второй батник и в конце запустить его (второй батник) из первого.
Стереть сам себя может, добавьте в самый конец батника:
Код:

Del "%~0"

Foreigner 15-05-2011 20:29 1676869

Весь вопрос только как самого себя перезаписывать. Вариант с помощью 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


amel27 16-05-2011 03:26 1677063

Цитата:

Цитата gora
Сам себя он дописать не сможет, т.к., он при выполнении будет занят системой. »

раз может стереть, значит может и дописать, но только в конец батника:
Код:

@echo off

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


sov44 16-05-2011 19:38 1677386

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

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

gora 16-05-2011 19:41 1677387

Код:

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

sov44 16-05-2011 20:30 1677409

Ещё вопрос. Как через Echo записать 2>Nul
Код:

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

gora 16-05-2011 20:33 1677413

Код:

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

Foreigner 16-05-2011 20:33 1677414

sov44,

echo 2^>nul

sov44 16-05-2011 22:20 1677491

Не получается записать %%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 1677592

Цитата:

Цитата 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


sov44 04-07-2011 21:44 1706922

Хочу улучшить скрипт установки обновлений, записывая в одно 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 1706947

Цитата:

Цитата 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

sov44 04-07-2011 22:31 1706963

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

gora 04-07-2011 22:38 1706972

А так?
Код:

@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 1706990

Цитата:

Цитата gora
А так? »

не подойдёт, т.к. %%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 1707027

Решение похоже нашел
Код:

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 1707145

Код:

@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 1707701

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 1707728

Код:

@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.
)


sov44 18-07-2011 14:55 1714989

Второй день ломаю голову, как записать в 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
но всё равно не получается как надо.

gora 18-07-2011 15:06 1714996

Цитата:

Цитата sov44
не получается как надо »

Запись зависит от 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


sov44 21-07-2011 13:08 1717096

gora, ещё вопрос. Необходимо, чтобы в командной строке при запуске пересобранного батника отражалась надпись Внимание! с знаком восклицания в конце. Пробовал увеличивать число ^^^, но безрезультатно.
Код:

>>"Inst.cmd" Echo ECHO                      Внимание^^!

gora 21-07-2011 13:22 1717111

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.

Время: 22:07.
© OSzone.net 2001-