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

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

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

vu1tur (26-05-2009 11:39): часть 7 — http://forum.ru-board.com/topic.cgi?forum=62&topic=17154#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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





    http://forum.ru-board.com/topic.cgi?forum=62&topic=17154

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 23:07 04-11-2008 | Исправлено: vu1tur, 11:38 26-05-2009
    CMD



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    В справке Windows написано что в команде route delete можно использовать подстановочные знаки, пишу "route delete 10.*", результат - "Сбой удаления маршрута: Параметр задан неверно.", хотя постоянные маршруты с точкой назначения 10.* имеются. Что неправильно делаю? Работает только "route delete *" или когда полностью указываю точку назначения.

    Всего записей: 311 | Зарегистр. 18-05-2004 | Отправлено: 09:31 10-04-2009
    sfinx26

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется код
    Код:
    tasklist /fi "imagename eq 111.exe"
    %errorlevel%
    if "%errorlevel%" =="0" goto :ILL
    goto IF_END
    :ILL taskkill /fi "imagename eq 111.exe"
    :IF_END command
     
    exit

    предпологается что он будет проверять наличие процесса , если его не находит и если находит убивать, и перезапускать  , пробелма в том что он этого не делает.
     
     
    специфика - использовать только "тасклист" "тасккил"  (pstat.exe нельзя)
    а вообще делается следующее  
    по расписанию батничек запускается, выполняет 111.ехе ,  потом  111.ехе должен завершится НО иногда он подвисает , да так что тасклист его не находит (приэтом тасккил зависший процесс прибить может) , и вот перед тем как должна выполнится последуюшая команда , надо проверить есть ли процесс или нет , если есть то он не завис и скоро закончится сам(т.е. его прибивать не надо) а вот если нету его надо пробовать прибить и если удается выполнять дальше... чет запутанно написал =)  
     

    Всего записей: 12 | Зарегистр. 10-04-2009 | Отправлено: 11:33 10-04-2009
    Robby

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите доделать батник. Нужно разобрать большое количество файлов. Есть такой код:

    Код:
     
    @echo off  
    cls
    pushd %1
    for %%a in (*.*) do (  
    for /f "delims=." %%b in ("%%~na") do (  
    md "%%b" 2>nul  
    if /i not "%%~xa"==".rar" (move "%%a" "%%b") else (
    echo %%a | findstr /i  /l /m ".part1">nul && rar x "%%a" "%%b">nul 2>&1
    echo %%a | findstr /i /l /m ".part">nul || rar x "%%a" "%%b">nul 2>&1
    if errorlevel 1 (echo Unpack error >> "%%~dpna.txt") else (del /q "%%a"))
    ))
     

    Берет часть имени файла до первой точки
    создает папку с этим именем
    если расширение файла не RAR то перемещает файл в созданную папку
    если расширение RAR и содержит ".part1" (многотомный архив) распаковывает только его, игнорируя другие part
    если в имени нет .part (обычный архив) распаковывает его
    если распаковка прошла успешно то удаляется текущий файл.
     
    Помогите доделать следующее:
    если errorlevel = 3 (Ошибка CRC) , то обработать файл содержащий список паролей pass.txt (файл находится там же где исходный батник и содержит по одному паролю в каждой строке).  Применить поочередно все пароли из списка Если распаковка прошла успешно errorlevel = 0, удалить исходный архив. Если будет достигнут конец списка, а errorlevel = 3 то  запрос пароля у пользователя. При неудаче распаковки архив не удалять.
     
    Помогите пожалуйста, сам не могу дойти до решения.

    Всего записей: 879 | Зарегистр. 28-09-2003 | Отправлено: 12:11 10-04-2009
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    CMD
    действительно, маски при удалении маршрутов не работают
    решение удалением каждого маршрута
    Код:
    @echo off
    set r_mask=10.*
    for /f %%a in ('netstat -r^|findstr %r_mask%') do route delete "%%a"

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 13:49 10-04-2009
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    sfinx26
    Код:
    set "tsk=calc.exe"
    tasklist|findstr/i "%tsk%"&&taskkill /f /im "%tsk%"&&start "" "%tsk%"

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 20:48 10-04-2009 | Исправлено: Nagual, 20:52 10-04-2009
    CMD



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nagual
    в таком случае поиск происходит по всей строке, а нужно только по точке назначения. Пример таблицы маршрутов:

    Код:
       
    Network Address      Netmask  Gateway Address  Metric
                10.2.0.0      255.255.0.0        10.0.45.1       1
          192.168.0.0      255.255.0.0        10.0.45.1       1
     

    нужно удалить маршруты с точкой назначения 10.*, т.е. первый маршрут, а удаляются оба т.к.  во второй строке с маской совпадает 10.0.45.1. Как сделать чтобы поиск был только по первым словам в строках?

    Всего записей: 311 | Зарегистр. 18-05-2004 | Отправлено: 11:26 11-04-2009 | Исправлено: CMD, 11:28 11-04-2009
    Valdon



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть строка неопределенной длины. Нобходимо выделить подстроку до первого(определенного "\") символа найденного в искомой строке справа на лево.... Как бы это попроще реализовать?
    Например:
    SET str=c:\werer\3 44\program\1 tttt
    нужно из str переменой str1 присвоить значение 1 tttt ?

    Всего записей: 428 | Зарегистр. 25-07-2005 | Отправлено: 14:25 11-04-2009 | Исправлено: Valdon, 14:39 11-04-2009
    01MDM



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

    Цитата:
    Например:
    SET str=c:\werer\3 44\program\1 tttt
    нужно из str переменой str1 присвоить значение 1 tttt ?

     
    Например:

    Код:
     
    @echo off
    setlocal
     
    set str="c:\werer\3 44\program\1 tttt"
    set str=%str:\=^",^"%
     
    for %%i in (%str%) do set "str1=%%~i"
    echo %str1%
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:59 11-04-2009
    Valdon



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, просто класс А если усложнить пример, нужно выделить не первую подстроку а третью справава на лево, т.е. чтоб  str1=3 44 ?
     
    ЗЫ:Извините за назойливость, хочу просто вкурить побольше примеров обработки строк, чтоб потом безпроблемно их батником парсить.....

    Всего записей: 428 | Зарегистр. 25-07-2005 | Отправлено: 16:24 11-04-2009
    batniki



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите:
     
    Есть переменные:

    Код:
    var "s1=blabla"
    var "s2=bla-bla"

     
    Я знаю, что есть s1, к нему нужно прибавить 1 и вывести s2.

    Всего записей: 50 | Зарегистр. 11-02-2008 | Отправлено: 16:24 11-04-2009
    01MDM



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

    Код:
     
    @echo off
    setlocal
     
    set "str=c:\werer\3 44\program\1 tttt"
     
    :: Определяем кол-во полей c разделителями "\"
    :tok
    set /a tok+=1
    for /f "tokens=%tok% delims=\" %%i in ("%str%") do (
        if not "%%i"=="" goto:tok
    )
     
    :: Берем нужное поле справа
    set /a tok-=3
     
    for /f "tokens=%tok% delims=\" %%i in ("%str%") do set "str1=%%i"
     
    echo %str1%
     

     
    PS. Отредактировал в соответсвии с вопросом:

    Цитата:
     
    а третью справа на лево,
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:02 11-04-2009 | Исправлено: 01MDM, 08:55 12-04-2009
    NvvLazyTiger



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Valdon
    Альтернативный ("справа налево") способ разбора именно путей на элементы:
    Код:
    @echo off
    set Str0=c:\werer\3 44\program\1 tttt
    set Num=0
    set Job=*
     
    :Again
    call :SplitWayJob "%Str0%"
    if NOT defined Job goto :eof
    echo Str%Num%=%Job%
    goto Again
     
    :SplitWayJob %str%
    set Way=%~dp1
    set Job=%~nx1
    set /a Num+=1
    set Str0=%Way:~0,-1%
    if %Num% == 1 set Str1=%Job%
    if %Num% == 2 set Str2=%Job%
    if %Num% == 3 set Str3=%Job%
    if %Num% == 4 set Str4=%Job%
    if %Num% == 5 set Str5=%Job%

    Всего записей: 257 | Зарегистр. 14-02-2009 | Отправлено: 02:54 12-04-2009
    AnGo



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Hi, all!
    Возникла не понятная мне проблема.
    Имеется следующий батничек:

    Код:
     
    @echo off  
    :try  
    ping -n 1 ххх.ххх.ххх.ххх | find /i "TTL=">nul  
    if %errorlevel%==0 (  
    echo Working  
    echo %TIME%
    ) else (  
    echo Not working  
    echo %DATE% %TIME%
    rasdial ИМЯ ЛОГИН ПАРОЛЬ
    ping -n 10 -w 1000 127.0.0.1>nul
    rasdial | find /i "ИМЯ" > null
    if %errorlevel% == 0 (
    echo ИМЯ started
    )else (
    echo ИМЯ not started
    )
    )  
    rem ping -n 300 -w 1000 127.0.0.1>nul  
    sleep.exe 300
    goto try  
     

    Идея проста, каждые пять минут пингуем роутер  ххх.ххх.хххх.хххх
    Если канал упал, то поднимаем соединение по имени ИМЯ.
    При работающем канале, каждые пять минут выводит на экран текущее время.
    Проблема состоит в том, что, судя по всему, батник отрабатывает ровно 20 раз. Или я чего не понимаю. Запускаю, на экран выводится только двадцать сообщений о текущем времени, после этого - тишина. Работает он или дурака валяют - не понятно.  
    Думал, сначала, что из-за спячки, поменял пинг на слип- эффект нулевой.  
    Какие будут соображения? Что здесь неправильно?  
     ЗЫ Забыл добавить - WinXP Home

    Всего записей: 1078 | Зарегистр. 07-07-2002 | Отправлено: 08:31 12-04-2009 | Исправлено: AnGo, 09:49 12-04-2009
    Maza_Faka



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

    Код:
     
    @Echo off
     
    :try
    ping -n 1 ххх.ххх.ххх.ххх | find /i "TTL=">nul && GoTo :Success || GoTo :Recon
     
    :Success
    echo Working
    echo %TIME%
    ping -n 300 -w 1000 127.0.0.1>nul
    GoTo :try
     
    :Recon
    echo Not working
    echo %DATE% %TIME%
    rasdial ИМЯ ЛОГИН ПАРОЛЬ
     
    ping -n 10 -w 1000 127.0.0.1>nul
     
    rasdial | find /i "ИМЯ">null && echo ИМЯ started || echo ИМЯ not started
    goto :try
     

    Не тестировал!

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 10:29 12-04-2009
    batniki



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите, пожалуйста с batch'ем.
     
    Нужно, чтобы в последней строке, где записывается %s1% , записывалось значение %value% +1 , т.е. value изначально равно 1, +1 = 2 получится переменная %s2% её содержимое и запишется в LogonPrompt
     

    Код:
    @echo off
    set "s1=blabla"
    set "s2=blabla2"
    set "s3=blabla3"
    set "s4=blabla4"
    set "s5=blabla5"
    set "s6=blabla6"
    set "s7=blabla7"
    set "s8=blabla8"
    set "s9=blabla9"
    set "s10=blabla10"
     
    reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v LogonPromptEnable >nul & if errorlevel 1 ( goto lack ) else ( goto resence )
     
    :: Добавление параметров со значениями
    :lack
    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /f /v "LogonPromptEnable" /t REG_SZ /d "1"
    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /f /v "LogonPrompt" /t REG_SZ /d "%s1%"
     
    :: Проверка значения параметра на integer
    :resence
    for /f "tokens=3*" %%i in ('reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /v LogonPromptEnable') do set "value=%%i %%j"
    echo %value% | findstr /i /r /c:"[0-9]">nul 2>&1||goto lack
    ...
    reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon" /f /v "LogonPrompt" /t REG_SZ /d "%s1%"
     

    Всего записей: 50 | Зарегистр. 11-02-2008 | Отправлено: 14:34 12-04-2009 | Исправлено: batniki, 14:37 12-04-2009
    quaka

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте!
    Просьба помочь в одном маленьком дельце))
     
    Допустим есть скрипт № 1,
    с таким кодом:
    "
    @echo on
    ping mail.ru >out.txt
    pause
    "
    Выводится результат pingа до mail.ru в out.txt.
     
    В out.txt появляются строчки на подобии:
    ...
    Ответ от 194.67.57.20: число байт=32 время=19мс TTL=117
    ...
     
    Как из файла out.txt вытащить IPшник mail.ru и вставить в скрипт № 1 команду "tracert (IP mail.ru)"?
     
    Просто сделать "tracert mail.ru" мне не совсем подходит т.к хочется понять как делать подобные подстановки.
    Заранее спасибо!
     
    Чуть дополню, допустим IP адрес всегда начинается на 194.67...., как бы организовать поиск в файле out.txt по такому шаблону?

    Всего записей: 7 | Зарегистр. 04-04-2009 | Отправлено: 21:39 12-04-2009 | Исправлено: quaka, 21:53 12-04-2009
    sas1111



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

     Доброго Вам.!!!.
    Нужно реализовать такую задачу -  
     
    Добавлено:
    .
     
     Доброго Вам.!!!.
    Нужно реализовать такую задачу - имеется файл Dannie.DAT
    нужно прочесть ЗНАЧЕНИЕ (до 8 байт) находящееся в адресах <смещение и байт начало>до<смещение и байт конца>. занести считанное значение в File1.dat  , перевести его в 10-тичное и записать в File2.dat. Адреса и имена передаются как параметры при запуске.
    типа <файл данных> <начало> <конец значения> File1.dat File2.dat
     
     xxx.bat Dannie.dat 00001053 0000105А File1.dat File2.dat
     
    (и прошу извенение за предидущее каряво отправленное сообщение. )
       
     
    .

    Всего записей: 7 | Зарегистр. 12-04-2009 | Отправлено: 21:42 12-04-2009
    Nagual



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    CMD
    после for /f поставить "tokens=1"

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 22:10 12-04-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    quaka
    Можно и без out.txt

    Код:
     
    @echo off
    for /f "tokens=2 delims=[]" %%i in ('ping -n 1 mail.ru') do tracert %%i
     

     
    Eсли с out.txt, то тогда: ... in (out.txt) do ...

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



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Valdon
    Код:
    set str="c:\werer\3 44\program\1 tttt"
    for /f "delims=" %%a in (%str%) do echo "%%~nxa"
     

    Цитата:
    если усложнить пример

    если путь существует
    Код:
    set str="c:\werer\3 44\program\1 tttt"
    cd/d %str%\..\..
    for /f "delims=" %%a in ("%cd%") do echo "%%~nxa"

    Всего записей: 528 | Зарегистр. 06-01-2006 | Отправлено: 22:41 12-04-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 6
    vu1tur (26-05-2009 11:39): часть 7 — http://forum.ru-board.com/topic.cgi?forum=62&topic=17154#1


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru