Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7

Модерирует : KLASS, IFkO

vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

   

vu1tur



Moderator-Saaber
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Задачи на bat-файлах 7
(часть 1, часть 2, часть 3, часть 4, часть 5, часть 6)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

 
Важно: копируя батник через буфер обмена из форума не забывайте удалять пробелы в конце каждой строки, т.к. в некоторых случаях из-за этого программа будет работать неправильно!!!
 
Также для удаления концевых пробелов пользуйтесь скриптом от Nagual, или VBS-Скрипт-Модулем от ViSiToR.
 
Для перекодирования кирилицы 866<<>>1251 пользуйтесь онлайн сервисом Перекодировщик кириллицы

 
Дополняем шапку: добавляем готовые решения, полезные ссылки.
 
Примечание: Большие куски кода заключайте в тэг [more]  
 
Смежные темы:
В помощь системному администратору » Автоматизация администрирования
Программы » Командная строка, батники\сценарии
 
Полезные ссылки
 
Полезные утилиты
 
Готовые решения и частые вопросы:
  • Встроенный справочник по командам
  • Создание помощи по всем командам консоли 2000 и XP
  • Делаем паузу в командном файле стандартными средствами Windows
  • Альтернативные решения »
  • Работа с текстом, датой, и файлами »
  • Администрирование, автоматизация и сеть »
  • Работа с переменными и параметрами ком. строки »
     
    Описания работы команд и символов участниками темы:
    · setlocal enabledelayedexpansion и переменные окружения
    · символы & и && в командной строке
    · Переменная %0

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:37 26-05-2009 | Исправлено: TechnicsKuzya, 13:53 27-12-2009
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha

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

    Я этого пока не умею . Даже термин "отпарсить" мне не знаком. Думаю, вышеприведённый пример мне и самому кое-где пригодится.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 13:17 16-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Код:
    for /f "tokens=*" %%A in ('taskkill /f /im proc.exe 2^>^&1') do set "var=%%A"
    echo %var%
    pause

     
    W:\>for /F "tokens=*" %A in ('taskkill /f /im proc.exe 2>&1') do set "var=%A"
     
    W:\>set "var=Ошибка: Не удается найти процесс "proc.exe"."
     
    W:\>echo Ошибка: Не удается найти процесс "proc.exe".
    Ошибка: Не удается найти процесс "proc.exe".
     
    W:\>pause
    Для продолжения нажмите любую клавишу . . .
     
    А как можно впихнуть в var еще и %errorlevel% выполнения taskkill   ???
     
    типа - Ошибка: Не удается найти процесс "proc.exe"._ErrLvl128

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 17:47 16-12-2009 | Исправлено: mugil_cephalus, 17:56 16-12-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus

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

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

    Код:
     
    2>nul taskkill /im prog.exe && echo success || echo fail
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 20:52 16-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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"
     
    и много как

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 21:03 16-12-2009 | Исправлено: mugil_cephalus, 21:38 16-12-2009
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    Может все-таки для полноты картины сделать то что я предлагал:
    - проверить есть ли процесс
    - если есть дать команду на убитие
    - проверить убился ли процесс
    - запустить то что нужно
    - проверить запущено ли то что нужно...
    И на каждом этапе будет ясно что происходит и как с этим бороться.
    А так вот в слепую убивать - мало ли что...

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2757 | Зарегистр. 15-12-2003 | Отправлено: 22:22 16-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    yurkesha
    так то была задача duh_S

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

     
    а в моей задаче - я присвоил переменной stdout и stderr от taskkill'a и нужно в нее же "всунуть" еще и %errorlevel%
     
    Добавлено:
    наверное, нужно оператор цикла отправлять на процедуру - do call:_1 "%%i"  

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 22:35 16-12-2009 | Исправлено: mugil_cephalus, 22:45 16-12-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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
     
     

     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 05:55 17-12-2009 | Исправлено: wolf0425, 06:08 17-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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
    спасибо за помощь

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 12:59 17-12-2009 | Исправлено: mugil_cephalus, 15:00 17-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ладно, сделаю себе удобоваримую рекурсию, - с нею все-таки лучше: жить можно, - чем множить "отходы производства", главное не попасть в бесконечную рекурсию  
     
     
     
    Добавлено:
    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 уровень

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 15:08 17-12-2009 | Исправлено: mugil_cephalus, 16:45 17-12-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    АПРИОРИ не может случиться, чтоб при %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%

    а в самом рекурсивном вызове ничего страшного нет, если аккуратно писать.
    Хотя если проект большой и уже использует рекурсию - то потребуется согласование, да.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 21:46 17-12-2009 | Исправлено: wolf0425, 21:55 17-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425

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

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

    - я как раз от файлов и пытался  уйти

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 21:52 17-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    по поводу рекурсии
    у меня был рекурсивный вызов батником самого себя с аргументом %1 типа так:  

    Код:
    call %~f0 %~n0FtskT

    а мне нужно рекурсивно запустить батник через hstart

    Код:
    call hstart /NOCONSOLE "%~f0 %~n0FtskT"

    у меня код еще не готов - проверить не могу - но, теоретически, мне кажется синтаксис не верен: call hstart
    так можно??? вызывать не напрямую батник, как процедуру, а через *.exe?

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 20:28 18-12-2009
    ruslan55x55

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

    Всего записей: 4 | Зарегистр. 19-12-2009 | Отправлено: 17:59 19-12-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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  
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:56 19-12-2009
    Umboking

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите решить такую задачу - необходимо проверить в папке 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
    )
     
    )

    Всего записей: 31 | Зарегистр. 21-12-2009 | Отправлено: 05:46 21-12-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    посоветуйте как подступиться к такому:
     
    на входе короткий file1.txt и длинный file2.txt
    нужно получить  file3.txt который содержит те строки file1, которых нет в file2.txt
    заранее известно присутствие в строках неизвестного количества символов "<>!:=%#
    (в смысле - они не должны быть препятствием к обработке)
    строки заметно длинные - до 600 символов легко, наверно могут и длиннее попасться. Хотя для сравнения достаточно первых 100 символов.
     
     
    еще вопрос - нельзя ли как-то команде for /f объяснить,  
    что разделителем полей надо считать символ двойной кавычки "

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 08:20 21-12-2009 | Исправлено: wolf0425, 10:18 21-12-2009
    ruslan55x55

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Большое спасибо вам 01MDM, Umboking за помощь!
     

    Всего записей: 4 | Зарегистр. 19-12-2009 | Отправлено: 11:28 21-12-2009
    ipmanyak



    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Цитата:
    нельзя ли как-то команде for /f объяснить,  
    Можно, в помощь for /?  
    читать по параметр  delims=xxx    
    delims="


    ----------
    В сортире лучше быть юзером, чем админом...

    Всего записей: 11976 | Зарегистр. 10-12-2003 | Отправлено: 11:32 21-12-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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"

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 12:00 21-12-2009 | Исправлено: mugil_cephalus, 12:49 21-12-2009
    wolf0425



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ipmanyak
    Цитата:

    Цитата:
    нельзя ли как-то команде for /f объяснить,  
    Можно, в помощь for /?  
    читать по параметр  delims=xxx    
    delims="
    ох уж эти теоретики, не затрудняющие себя проверками.
    чтение for /? как раз говорит что " будет трактоваться как закрывающая для "options", а не как параметр для составной части options (delims=)
    т.е. если  " и можно указать разделителем, то только через какой-то финт, о нем собственно и спрашивалось.
     
     
     
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 18:27 21-12-2009
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 7
    vu1tur (25-01-2010 12:41): лимит страниц, продолжение: http://forum.ru-board.com/topic.cgi?forum=62&topic=19668


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru