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

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

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

vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

Nagual



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

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

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

  • Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 12:28 19-03-2008 | Исправлено: Nagual, 01:02 24-09-2008
    Serhi_84

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Люди, подскажите, пожалуйста, где глюк?
    Задача - вывести последние N строк из файла в другой файл (N задается как параметр при запуске скрипта). Если строк в файле меньше, чем N - выводим все строки.
     
    Идея - считаем общее количество строк, вычитаем N - получаем параметр skip для for.
     
    set cnt = 0
     
    for /F "delims=$" %%a in (c:\test\log.txt) do set /a cnt+=1  
     
    set /a nstr = (%cnt% - %1)
        IF %cnt% LEQ %1 (
            for /f %%b in (c:\test\log.txt) do echo %%b >> c:\test\log2.txt
        ) else (
            for /f "skip=%nstr% tokens=*" %%c in (c:\test\log.txt) do echo %%c >> c:\test\log2.txt
        )
     
    Почему то не срабатывает. И еще проблема в том, что в файле где-нибудь посередине могут быть пустые строки, то есть нужно выводить последние N значимых строк.
     
     
    P.S. заработало, изменил условие на IF %nstr% LEQ 0. Сейчас даже если посредине есть пустые строки он их просто игнорирует и не считает

    Всего записей: 30 | Зарегистр. 29-02-2008 | Отправлено: 10:58 30-04-2008 | Исправлено: Serhi_84, 13:30 30-04-2008
    Leopold70

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

    Цитата:
    D:\ORG\Неизвестное Имя 1\DDMM\  
    ..........................  
            \Неизвестное Имя 200\DDMM\

     
    Решил свою задачку так:
     
    if not exist D:\ORG goto er
     
    cd D:\ORG\
     
    SET DM=%DATE:~0,2%%DATE:~3,2%
     
    FOR /R %%i IN (%DM%) do (
    cd %%i
    for /f "tokens=1,2 delims=." %%a in ('dir /b *.txt *.dbf') do (
    ARJ32 M -E -JM %%i\%%a.ARJ %%a.txt %%a.dbf || (
    copy %%i\%%a.ARJ C:\mail\
    )))
    exit
    :er
     
    если возможно покрасивее, подскажите?

    Всего записей: 2 | Зарегистр. 26-12-2007 | Отправлено: 11:20 30-04-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Serhi_84
    Давай распишем задачу:
    всего строк пусть будет 100
    из них 13 и 67 пустые
    тебе нада вывести 50 последних строк, т. е. учитывая пустую 67 строку:51 последнюю строку, включая пустую, так?

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 12:18 30-04-2008
    Serhi_84

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven, да так.  
    Хотя у меня в исходном файле все сплошным текстом идет, на всякий случай себя обезопасить, потому что если встретится пустая строка, то общее количество строк скрипт будет считать от начала до пустой строки, а последующие строки просто проигнорирует

    Всего записей: 30 | Зарегистр. 29-02-2008 | Отправлено: 12:25 30-04-2008
    Dantis

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    мне о кто нить с этим поможет??  
     
     
     Привет всем =). У меян появилось еще пара вопросов...  
     
    1) Как Запустиьть с Помощью Батника  Службу??  ( имя ее Diskeeper )  
    2) Как убить процесс   avp.exe (Антивирус Карсперского 6.0 ) и oupost.exe (Фаер Вол  OutPost 4.0)  (через диспетчер задач я их убить не могу =( )  
    3)  
    Как запутить программы с помощью батника.&  
     
    пишу  start F:\Проги\Norton WinDoctor 2007\WINDOC.EXE       и не работает.... похоже запинается на русских буквах и пробелах =(  
     
    Мне надо запустить пару файлов:  
     
    F:\Проги\Norton WinDoctor 2007\WINDOC.EXE    
    F:\Проги\Diskeeper Corporation\Diskeeper\Diskeeper.msc  
    F:\Проги\VitSoft\Vit Registry Fix\Vit Registry Fix 4.2.exe  
    F:\Проги\CCleaner2.03\CCleaner.exe  
     
     
    PS/  просто при чистке компа   (Реестра\ дефрагментации дисков)  я закрываю все процессы которые можно закрыть.и запускаю эту службу (в ручную) и запускаю проги.... хотелось бы  автоматизировать этот процесс.
     
     
     Ответте хотя бы на 1-вый вопрос..

    Всего записей: 26 | Зарегистр. 25-03-2008 | Отправлено: 14:31 30-04-2008
    Cheerful_a_bear



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Привет всем
    Уже сутки читаю форум, начал с Первой части, жаль, что нет поиска по форуму, не смог найти объективного решения задачи.
    ПОМОГИТЕ.
    Вот мой шедевр...
     
    @echo off  
    md c:\BackUP\DOC\
    md c:\BackUP\XLS\
    for /R %%f IN (.) DO (
    cd %%f
    xcopy/v /y "*.doc" "c:\BackUP\DOC\"
    xcopy/v /y "*.xls" "c:\BackUP\xls\"
    cd ..
    )
    rar.exe a -r -agdd-mm-yyyy -m5 -df -y c:\BACKUP\Архив\Архив_DOC_за_.rar c:\BackUP\DOC\
    rar.exe a -r -agdd-mm-yyyy -m5 -df -y c:\BACKUP\Архив\Архив_XLS_за_.rar c:\BackUP\XLS\
     
     
    Как сделать так, чтобы архивные файлы старше месяца автоматически удалялись, а на их место записывались новые?

    Всего записей: 103 | Зарегистр. 30-04-2008 | Отправлено: 14:50 30-04-2008
    bmax

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Свою задачу так и не решил, поэтому решил пойти другим путем:
     
    Помогите пожалуйста поправить код:  
    Необходимо найти последний файл в папке "D:\1" и определить его имя  
    Затем в папке "D:\2"  взять известный нам файл скажем qqq.dat  и определить номер строки в которой втречается имя найденного выше файла.(причем заведомо известно что оно может встретиться только один раз, поэтому как только нашли - дальше искать не стоит) Затем  в папке "D:\3" берем файл с именем 'старое имя' +'номер строки' + 'старое расширение' и копируем его в папку "D:\4" с переименовыванием
     

    Цитата:
    @echo off  
    FOR /f "tokens=*" %%i in ('dir /b /s /a-d "D:\4\*.*"') do set /a count+=1  
    IF EXIST D:3\*.* set "count=0%count%" ELSE  
    set "count=00%count%"  
    set "count=%count:~-2%"  
    for /f "tokens=*" %%c in ('dir "D:\1\*.*" /o:-d /t:c /b /a:-d') do (  
     
     - присвоить имя найденного файла переменной???????  
     
     - взять в папке D:\2 файл qqq.dat  и определить номер строки в которой встречается имя найденного выше файла ??????????
     
     - Затем  в папке "D:\3" берем файл с именем 'старое имя' +'номер строки' + 'старое расширение' и копируем его в папку "D:\4" с переименовыванием???????????
       
    copy /y /D "D:\3\%%f" "D:\4\17%date:~0,2%%count%.dvc"  
    goto :eof  
    )  
    )

     
    Надеюсь на вашу помощь!
    Спасибо!

    Всего записей: 32 | Зарегистр. 13-09-2006 | Отправлено: 14:55 30-04-2008 | Исправлено: bmax, 14:58 30-04-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Serhi_84
    Подобный пример был ранее рассмотрен, если строка начинается с пробела или пустая строка работать не будет. Наверно лучше утилитки текстовые юзать, сам их не иcпользую.
     
    Cheerful_a_bear
    Справку к рару читал?

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 15:15 30-04-2008 | Исправлено: king_stiven, 15:16 30-04-2008
    01MDM



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

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 15:52 30-04-2008 | Исправлено: 01MDM, 16:00 30-04-2008
    Cheerful_a_bear



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ДА прочитал подробно но решения не вижу...

    Всего записей: 103 | Зарегистр. 30-04-2008 | Отправлено: 16:21 30-04-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Cheerful_a_bear
     -tn<время>
                Обрабатывать файлы не старее, чем указанный период времени.
     
                Задающая время строка имеет следующий формат:
     
                [<дни>d][<часы>h][<минуты>m][<секунды>s]
     
                Например, для обработки файлов, изменённых менее 15 дней назад,
                используйте ключ '-tn15d', а для обработки файлов, изменённых
                менее чем 2 часа 15 минут назад, используйте '-tn2h15m'.
     
     
        -to<время>
                Обрабатывать файлы более старые, чем указанный период времени.
     
                По формату аналогичен ключу '-tn<время>'.
    или тебе нужно строго по дням, 10 марта-10 февраля?

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 16:47 30-04-2008
    Cheerful_a_bear



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Эту я задачу я решил просто...
     
    @echo off Привет Всем
     
    set T_Date=%DATE%-2  
    SET /A T_DAY=%T_DATE:~0,2%
    SET /A T_MONTH=%T_DATE:~3,2%
    SET /A T_YEAR=%T_DATE:~6,4%  
    IF %T_DATE:~3,1%==0 (  
       SET /A O=%0%) else (  
       SET /A O=%%)  
    IF %T_DAY:~0,1%==0 (  
       SET /A OO=%0%) else (  
       SET /A OO=%%)  
     
    set /A T_DAY=%T_DAY%-2  
    if %T_DAY%==0 (  
       SET /A T_MONTH=%T_MONTH%-1  
       if %T_MONTH%==0 (  
          set /A T_YEAR=%T_YEAR%-1  
          SET /A T_MONTH=12  
          set /A T_DAY=31)  
          else (  
          if %T_MONTH%==1 (Set /A T_Day=31)  
          if %T_MONTH%==2 (Set /A T_Day=28)  
          if %T_MONTH%==3 (Set /A T_Day=31)  
          if %T_MONTH%==4 (Set /A T_Day=30)  
          if %T_MONTH%==5 (Set /A T_Day=31)  
          if %T_MONTH%==6 (Set /A T_Day=30)  
          if %T_MONTH%==7 (Set /A T_Day=31)  
          if %T_MONTH%==8 (Set /A T_Day=31)  
          if %T_MONTH%==9 (Set /A T_Day=30)  
          if %T_MONTH%==10 (Set /A T_Day=31)  
          if %T_MONTH%==11 (Set /A T_Day=30)  
          if %T_MONTH%==12 (Set /A T_Day=31)  
       )  
    )  
    md c:\BackUP\DOC\
    md c:\BackUP\XLS\
    for /R %%f IN (.) DO (
    cd %%f
    xcopy/v /y /d:%O%%T_MONTH%-%OO%%T_DAY%-%T_YEAR% "*.doc" "c:\BackUP\DOC\"
    xcopy/v /y /d:%O%%T_MONTH%-%OO%%T_DAY%-%T_YEAR% "*.xls" "c:\BackUP\XLS\"
    cd ..
    )
    rar.exe a -r -agdd-mm-yyyy -m5 -df -y -ta%T_YEAR%%O%%T_MONTH%%OO%%T_DAY% c:\BACKUP\Архив\NET\Архив_DOC_за_.rar c:\BackUP\DOC\
    rar.exe a -r -agdd-mm-yyyy -m5 -df -y -ta%T_YEAR%%O%%T_MONTH%%OO%%T_DAY% c:\BACKUP\Архив\NET\Архив_XLS_за_.rar c:\BackUP\XLS\
    del /s/q c:\BackUP\DOC\
    del /s/q c:\BackUP\XLS\
    rmdir c:\BackUP\DOC\
    rmdir c:\BackUP\XLS\
     
     
     
    А вот ка удалять созданные архивы старее 15 дней?
    Вот вопрос...

    Всего записей: 103 | Зарегистр. 30-04-2008 | Отправлено: 17:34 30-04-2008
    kucuk

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет!
     
    Как можно присвоить переменной значение следующей команды  
    netstat -an | find "3389" | find /c "ESTABLISHED" ?
    Сделал через файл, но как-то коряво читать-писать один символ через файл.
    Заранее спасибо

    Всего записей: 2 | Зарегистр. 04-04-2006 | Отправлено: 17:34 30-04-2008
    01MDM



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

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:45 30-04-2008
    STtt



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо
    Nagual
    01MDM
    Пришлось правда поискак эту robocopy немного, но за то теперь все работае со скриптами.

    Всего записей: 33 | Зарегистр. 26-01-2003 | Отправлено: 22:32 30-04-2008
    Takuja

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем привет. Ребята, и Нэйджел, помогите в одном не большом вопросе. Я относительно недавно спрашивал у вас как можно создать журнал трасировки в хорошем читабельном виде, для проверки стабильности конекта на протяжении определенного времени.  
    Вообщем я его написал из командной строки. Почти...  
    Вот код.
     

    Код:
    :_start
    setlocal
    set _var=X
    for /F "usebackq skip=4 tokens=1-5 delims= " %%i IN (`tracert combats.ru -d -w 1000`) DO set _var%%i=%%j
    endlocal
    goto _start

     
    в теории оно работает, и создает _var%%i столько переменных, сколько узлов определяется в триссировке.  
    НО
    Как мне из всех этих переменных создать одну строку?
    что бы стояли переменные по типу
    _var1 - _var2 - ... - _var%%i
    эту строку в идеале я всовываю в текстовичёк, цыклю и воаля, готова таблица отчёта связи с каждым узлом по трассеру.
     
    как вариант решения я думал использовать такую комбинацию после DO
    set _var=%_var%-%%j
    тут как бы в цыкле оператора FOR должно было присваиватся в переменную сама переменная _var и дописыватся каждый раз значение %%j (указывающий текущий пинг)  
    НО
    Оно не работает, в этом варианте переменная _var не выносит всоё значение за пределы цыкла оператора FOR и получается что моя переменная _var  после цыклов имеет всего лиш последнее значение а не все значения в одну строку.  
     
    Вот эту задачьку я б хотел решить, как мне все полученные переменные в строку одну всунуть?

    Всего записей: 64 | Зарегистр. 11-02-2008 | Отправлено: 11:01 01-05-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Takuja
    Используй setlocal enabledelayedexpansion для set _var=!_var!%%i в цикле.
     
    Или выноси set из цикла

    Код:
     
    for ..... do (
        call:label "%%i"
    )
    goto:eof
     
    :label
    set _var=%_var%%~1
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 11:14 01-05-2008 | Исправлено: 01MDM, 11:19 01-05-2008
    Takuja

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    то что ты предложил не очень помогло, так как CALL вызывает разово якорь и выходит из цыкла, потому присваивается только первре значение и всё, больше вичего не происходит.
    Другой вариант есть?

    Всего записей: 64 | Зарегистр. 11-02-2008 | Отправлено: 12:44 01-05-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Takuja
     
    Ну да, это особенности tracert...
    Тогда, как-нибудь так

    Код:
     
    @echo off
    setlocal
    tracert ya.ru -d -w 1000 >>1.tmp
    for /F "usebackq skip=4 tokens=1-5 delims= " %%i IN (1.tmp) DO (
        call:res "%%i" "%%j"
    )
    del 1.tmp
    echo %var:~0,-1%
    goto:eof
    :res
    echo %~1 %~2 | findstr [0-9] 1>nul && (
        set var=%var%%~1:%~2_
    )
     
     
     
     
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 13:24 01-05-2008
    Takuja

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Таааак. Вот написал, полностью рабочий вариант, давольно просто и сердито.  
    Вобщем копируете это в батник, и запускаете, по умолчанию там внесено трассировка  Комбатс.ру и сохранение отчета на диске Д.  
    Эти параметры можно поменять в заголовке  сетап.
     
    Суть программы заключается в проверке каждого компьютера от локальной машины до  машины пункта назначения, показывая в удобной форме задержку между машинами.
    Вот сам Код, может комуто пригодиться.  
     

    Код:
    @echo off
    setlocal enabledelayedexpansion
    rem ------------------
    rem SETUP NASTROIKI
    rem _sname - server name (imja servera)
    rem _path - document path (put' jurnala)
    rem ------------------
    set _sname=combats.ru
    set _path=d:\
     
    echo TRACERT SERVIS IS RUNING
    echo Tracering %_sname%
    echo Jurnal in %_path%%_sname%.txt
    tracert %_sname% -w 1000 >> %_path%%_sname%.txt
     
    :_start
    set _var=%TIME%
    for /F "usebackq eol=’ skip=4 tokens=1-5 delims= " %%i IN (`tracert %_sname% -d -w 1000`) DO (call:label "%%j")  
    echo %_var% >> %_path%%_sname%.txt
     
    goto _start
     
    endlocal
    goto:eof  
    :label  
    set _var=%_var%    "%~1"

     
    с кодировкой я не игрался, если кому то нада, правте сами.

    Всего записей: 64 | Зарегистр. 11-02-2008 | Отправлено: 17:48 01-05-2008
       

    Страницы: 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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 5
    vu1tur (04-11-2008 23:07): Задачи на bat-файлах 6


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

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru