Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 7

Автор: yurkesha
Дата сообщения: 16.12.2009 11:48
mouser
Код: FOR /f "usebackq tokens=1,2* eol=;" %%a IN (`REG QUERY "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "1250"^|FIND /I "1250"^|FIND /I "REG_SZ"`) DO IF "%%a"=="1250" SET "PARAM=%%c"
ECHO %PARAM%
Автор: BVV63
Дата сообщения: 16.12.2009 12:17
yurkesha

Цитата:
Надо правильно отпарсить и все...

Я этого пока не умею . Даже термин "отпарсить" мне не знаком. Думаю, вышеприведённый пример мне и самому кое-где пригодится.
Автор: mugil_cephalus
Дата сообщения: 16.12.2009 16:47

Код: for /f "tokens=*" %%A in ('taskkill /f /im proc.exe 2^>^&1') do set "var=%%A"
echo %var%
pause
Автор: 01MDM
Дата сообщения: 16.12.2009 19:52
mugil_cephalus

Цитата:
А как можно впихнуть в var еще и %errorlevel% выполнения taskkill ???

Лучше использовать конструкцию:

Код:
2>nul taskkill /im prog.exe && echo success || echo fail
Автор: mugil_cephalus
Дата сообщения: 16.12.2009 20:03
01MDM

Цитата:
Лучше использовать конструкцию:

а с моим вариантом никак? мне именно так нужно. Но если никак - то на нет и суда нет. Но может все таки как то можно?
я просто и так и сяк пытался и с setlocal enabledelayedexpansion...
и так - ('taskkill /f /im proc.exe 2^>^&1 ^&set var2^=%errorlevel%')

for /f "tokens=*" %%A in ('taskkill /f /im proc.exe 2^>^&1') do echo !errorlevel! & set "var=%%A"

for /f "tokens=*" %%A in ('taskkill /f /im proc.exe 2^>^&1 ^&echo !errorlevel!') do set "var=%%A"

и много как
Автор: yurkesha
Дата сообщения: 16.12.2009 21:22
mugil_cephalus
Может все-таки для полноты картины сделать то что я предлагал:
- проверить есть ли процесс
- если есть дать команду на убитие
- проверить убился ли процесс
- запустить то что нужно
- проверить запущено ли то что нужно...
И на каждом этапе будет ясно что происходит и как с этим бороться.
А так вот в слепую убивать - мало ли что...
Автор: mugil_cephalus
Дата сообщения: 16.12.2009 21:35
yurkesha
так то была задача duh_S

Цитата:
подскажите пожалйуста как в батнике при его запуске сделать проверку на наличие запущенного процесса и если он есть то завершить выполнение а при отсутствии выполнить действие


а в моей задаче - я присвоил переменной stdout и stderr от taskkill'a и нужно в нее же "всунуть" еще и %errorlevel%

Добавлено:
наверное, нужно оператор цикла отправлять на процедуру - do call:_1 "%%i"
Автор: wolf0425
Дата сообщения: 17.12.2009 04:55
mugil_cephalus
если очень хочется поизвращаться - можно изобразить что-то типа

Код: @echo off
if .%1 neq ._kill goto :start
taskkill /f /im proc.exe 2>&1
echo ErrorLevel=%errorlevel%
goto :eof

:start
setlocal enabledelayedexpansion

for /f "tokens=*" %%A in ('"%~f0" _kill') do set "error=!error!%%A "
set error

Автор: mugil_cephalus
Дата сообщения: 17.12.2009 11:59
wolf0425
спасибо я посмотрю синтаксис: пути отработки скрипта
но при беглом взгляде, если я правильно детерминировал, в коде походу рекурсия, а у меня - эта задача, которую сейчас решаем сама часть процедуры в большом (со многими аргументами, функциями и ветвлениями по subroutines) master-script'e и поэтому я стараюсь максимально возможно редуцировать код, а то излишняя вычурность потом, в будущем аукнется ошибками

Добавлено:
wolf0425

Цитата:
set error

это удаление переменной?? я что-то не пойму эту стринг
может set error= ?

Добавлено:
wolf0425
вроде что-то не так (ладно, если окромя рекурсии не найду решения, тогда - впоследствие - сам отлажу код)
вот листинг запуска в комстроке (файла r.bat):
W:\>r

W:\>if . NEQ ._kill goto :start

W:\>setlocal enabledelayedexpansion

W:\>for /F "tokens=*" %A in ('"W:\R.bat" _kill') do set "error=!error!%A"

W:\>set "error=!error!W:\>if ._kill NEQ ._kill goto :start "

W:\>set "error=!error!W:\>taskkill /f /im proc.exe 2>&1 "

W:\>set "error=!error!Ошибка: Не удается найти процесс "proc.exe"."

W:\>set "error=!error!W:\>echo ErrorLevel=128 "

W:\>set "error=!error!ErrorLevel=128"

W:\>set "error=!error!W:\>goto :eof "

W:\>set error
error=W:\>if ._kill NEQ ._kill goto :start W:\>taskkill /f /im proc.exe 2>&1 Ошибка: Не удается найти процесс "proc.exe".W:\>echo ErrorLevel=128
ErrorLevel=128W:\>goto :eof

W:\>


p.s.
ладно, походу, эта задача решается только через рекурсивный вызов батником самого себя, а без рекурсии - только через процедуры внутри тела батника - никак

01MDM
yurkesha
wolf0425
спасибо за помощь
Автор: mugil_cephalus
Дата сообщения: 17.12.2009 14:08
ладно, сделаю себе удобоваримую рекурсию, - с нею все-таки лучше: жить можно, - чем множить "отходы производства", главное не попасть в бесконечную рекурсию



Добавлено:
wolf0425 & all
верный дискурс (?) - text of STDERR taskkill'a - «Ошибка: Не удается найти процесс "proc.exe".» - ведь определяется/генерируется по номеру %errorlevel% и , следоательно, АПРИОРИ не может случиться, чтоб при %errorlevel%=128 вывидется ДРУГОЙ текст, то есть другой текст будет ТОЛЬКО при другой ошибке - %errorlevel% NEQ 128 (если не расматривать пока STDOUT с %errorlevel%=0)

???

тогда можно будет опустить присваивание к переменной var еще и %errorlevel%, в работе мне нужен будет в основном текст stdout и stderr, который будет соответсвенно «Ошибка: Не удается найти процесс "proc.exe".» и/или «Успешно: Процесс "Multilex.exe", с идентификатором 1832, был завершен.» и если тескт будет другим (индуктивно резюмируя, это очень маловероятно в моем случае), соответсвенно в другой сессии я "натравлю" код на получение %errorlevel% и таким образом я в своей задаче уменьшу глубину рекурсии на 1 уровень
Автор: wolf0425
Дата сообщения: 17.12.2009 20:46

Цитата:
АПРИОРИ не может случиться, чтоб при %errorlevel%=128 вывидется ДРУГОЙ текст

угу, не может.
в общем-то решение без рекурсии есть (и очевидно) - но оно с созданием промежуточного файла, что мне нравится куда меньше рекурсии

Код: @echo off
taskkill /f /im proc.exe 2>&1 1>file.log
set error_l=%errorlevel%
set /p error_m=<file.log
echo %error_m% ErrorLevel=%error_l%
Автор: mugil_cephalus
Дата сообщения: 17.12.2009 20:52
wolf0425

Цитата:
в общем-то решение без рекурсии есть (и очевидно) - но оно с созданием промежуточного файла, что мне нравится куда меньше рекурсии

абсолютно согласен -
Цитата:
ладно, сделаю себе удобоваримую рекурсию, - с нею все-таки лучше: жить можно, - чем множить "отходы производства",

- я как раз от файлов и пытался уйти
Автор: mugil_cephalus
Дата сообщения: 18.12.2009 19:28
wolf0425
по поводу рекурсии
у меня был рекурсивный вызов батником самого себя с аргументом %1 типа так:

Код: call %~f0 %~n0FtskT
Автор: ruslan55x55
Дата сообщения: 19.12.2009 16:59
Здравствуйте. подскажите как сделать так чтобы, bat файл выполнял указанные в нем команды только после n-го кол-ва его запусков, ну например чтобы Bat файл удалил себя после 3-го его запуска. может какие нибудь файлы использовать для точки отсчета запусков.
Автор: 01MDM
Дата сообщения: 19.12.2009 17:56
ruslan55x55
Можно создать временный файл или записывать значения в реестр. Например:

Код:
@echo off
setlocal

2>nul 1>&2 reg query hkcu\environment /v test || call:set 4

for /f "tokens=3" %%i in ('reg query hkcu\environment /v test') do (

    if %%i leq 1 (
        1>nul reg delete hkcu\environment /v test /f
        del "%~f0"
        goto:eof
    ) else (
        call:set %%i
    )
)

echo executing batch body here

goto:eof


:set
set /a var=%1-1
1>nul reg add hkcu\environment /v test /t reg_sz /d %var% /f
Автор: Umboking
Дата сообщения: 21.12.2009 04:46
Помогите решить такую задачу - необходимо проверить в папке XX наличие папки XXX, если папка XXX присутствует, то удалить все файлы из XXX, скопировать все файлы без расширения в папку XXX из XX. Если папки XXX в папке XX нет, то создать папку XXX создать флаг-файл и скопировать все фалы без расширений из XX в XXX.

Добавлено:
ruslan55x55

Цитата:
подскажите как сделать так чтобы, bat файл выполнял указанные в нем команды только после n-го кол-ва его запусков, ну например чтобы Bat файл удалил себя после 3-го его запуска. может какие нибудь файлы использовать для точки отсчета запусков.

Как то так:

Код: if not exist *.f_l cd. >one.f_l

for %%i in (*.f_l) do (
if /i %%~ni==one (
ren one.f_l two.f_l
Exit
)

if /i %%~ni==two (
ren two.f_l three.f_l
Exit
)

if /i %%~ni==three (
Del /F /Q three.f_l
Del /F /Q %0
)

)
Автор: wolf0425
Дата сообщения: 21.12.2009 07:20
посоветуйте как подступиться к такому:

на входе короткий file1.txt и длинный file2.txt
нужно получить file3.txt который содержит те строки file1, которых нет в file2.txt
заранее известно присутствие в строках неизвестного количества символов "<>!:=%#
(в смысле - они не должны быть препятствием к обработке)
строки заметно длинные - до 600 символов легко, наверно могут и длиннее попасться. Хотя для сравнения достаточно первых 100 символов.


еще вопрос - нельзя ли как-то команде for /f объяснить,
что разделителем полей надо считать символ двойной кавычки "
Автор: ruslan55x55
Дата сообщения: 21.12.2009 10:28
Большое спасибо вам 01MDM, Umboking за помощь!

Автор: ipmanyak
Дата сообщения: 21.12.2009 10:32
wolf0425
Цитата:
нельзя ли как-то команде for /f объяснить,
Можно, в помощь for /?
читать по параметр delims=xxx
delims="
Автор: mugil_cephalus
Дата сообщения: 21.12.2009 11:00
ipmanyak

Цитата:
Можно, в помощь for /?
читать по параметр delims=xxx
delims="

это в теории, а на практике я по разному пытался всунуть - и никак
и так - ^"
и так - F:\Documents and Settings\admin>for /f "delims=" tokens=1" %i in (%date%) do echo %i
Непредвиденное появление: tokens.
я n страниц назад задавл такой же вопрос
если "tokens=* delims=" - то это удаление всех разделителей

можно показать код-пример?

Добавлено:
01MDM

Цитата:
for /f "tokens=3" %%i in ('reg query hkcu\environment /v test') do (

if %%i leq 1 (
1>nul reg delete hkcu\environment /v test /f
del "%~f0"
goto:eof
) else (
call:set %%i
)
)


это, если правильно понял, удаление батником самого себя
вопрос: не появится ошибка: данный файл занят другим процессом - по теории же должно быть так (код удаления батника компилируется из этого же батника) ?

Добавлено:
проверил - на практике почему-то не так (удаляет сам себя по коду удаления в себе)
странно...

тогда у меня рекурсивный вызов батником самого себя должен так запуститься:

Код: start hstart /NOCONSOLE "%~f0 arg1"
Автор: wolf0425
Дата сообщения: 21.12.2009 17:27
ipmanyak
Цитата:

Цитата: нельзя ли как-то команде for /f объяснить,
Можно, в помощь for /?
читать по параметр delims=xxx
delims="
Автор: ALEKCEN
Дата сообщения: 21.12.2009 18:00
Как устанавливать что-либо из .inf файла по средствам .bat (.cmd) файла ?

Нужно установить дрова\проги из .inf файла (уже готовые),но не знаю как это прописать в батник,подскажите плиз,как.
И ещё,подскажите где найти инфу,как создать свой .inf файл,что в нём должно содержаться и т.д. и т.п.

Ах да,надо не одну установку,а несколько.
И да,ещё хотелось-бы узнать,как это делается в WinRar`е,7-zip`е.
Автор: wolf0425
Дата сообщения: 21.12.2009 18:16
ALEKCEN тебе надо запустить стандартный гуевый инсталлятор или что-то более хитрое?

если в ассоциациях никто не копался то start "" drova.inf
Автор: ALEKCEN
Дата сообщения: 21.12.2009 19:43
Данный способо не прокатил - он просто открывает .inf файл.

Немного подробнее,что я хочу сделать - есть готовые .inf файлы - их запускаешь (правой кнопкой-установить) всё в ажуре,всё устанавливается,но мне надо сделать тоже самое,только из командной строки.
Автор: mugil_cephalus
Дата сообщения: 21.12.2009 19:59
ALEKCEN

start "" /dc:\ c:\setup.exe c:\file.inf
Автор: GORA2
Дата сообщения: 21.12.2009 20:05

Цитата:
Как устанавливать что-либо из .inf файла по средствам .bat (.cmd) файла ?


Код: rundll32 advpack,LaunchINFSection MyNameInf.inf,DefaultInstall,0
Автор: mugil_cephalus
Дата сообщения: 21.12.2009 20:32

Код: for /f "tokens=3" %%i in ('subst ^|find /i "%DataDrive%\scripts\test"') do if /i "_%%i" neq "_%DataDrive%\scripts\test" subst x: %DataDrive%\scripts\test
subst
pause
Автор: ALEKCEN
Дата сообщения: 21.12.2009 20:42

Цитата:
rundll32 advpack,LaunchINFSection MyNameInf.inf,DefaultInstall,0


Огромнейшая тебе благодарность,а то уж как только не пробовал,ничего не прокатывало,думал уж никто меня не может понять и помочь,пасиба.
Автор: wolf0425
Дата сообщения: 21.12.2009 22:03
надо избиратьтельно прибить все теги в неправильном месте, оставив в остальных
строки в файле примерно такие:
^(тут оставить как есть)</small>(тут прибить теги <br> и любые другие)</DL>$

Есть идеи как это попроще объяснить sed, не перечисляя все возможные теги?
Автор: Umboking
Дата сообщения: 21.12.2009 22:55

Цитата:
Помогите решить такую задачу - необходимо проверить в папке XX наличие папки XXX, если папка XXX присутствует, то удалить все файлы из XXX, скопировать все файлы без расширения в папку XXX из XX. Если папки XXX в папке XX нет, то создать папку XXX создать флаг-файл и скопировать все фалы без расширений из XX в XXX.

Собственно для меня здесь вся заковыка в том - как отличить папку от файла с таким же именем без расширения. Можно решить?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778

Предыдущая тема: во вкладке автозагрузка


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.