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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    mat86



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    должен запускаться c cdrom

    Цитата:
    @echo off
    for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m ) do if exist "%%i:\antivirus\curiet.exe" "%%i:\antivirus\curiet.exe"

    вот это готовый батник, он работает с любого диска в любом месте и запускает антивирус как положено. Но если у меня и на cdrom  и на флэш совподают пути antivirus\curiet.exe, bat запустит и с флэш и с cdrom без разбору, нужно чтобы bat пропускал cdrom. king_stiven, ты же мне вчера его написал он четко работает, но можно сделать чтобы он запускал с (q w e r t y u i o p a s d f g h j k l z x c v b n m ), но пропускал cdrom или запускал c (q w e r t y u i o p a s d f g h j k l z x c v b n m ) если это не cdrom

    Всего записей: 438 | Зарегистр. 19-03-2009 | Отправлено: 20:33 02-11-2009 | Исправлено: mat86, 20:36 02-11-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mat86
    Создай на своём сдроме в корне файл например : zzzz.rrr

    Код:
    @echo off  
    for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m ) do if not exist "%%i\:zzzz.rrr" if exist "%%i:\antivirus\curiet.exe" "%%i:\antivirus\curiet.exe"  


    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 21:34 02-11-2009
    mat86



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    все равно запустился с диска, без ошибок
     
    Добавлено:

    Цитата:
    Создай на своём сдроме в корне файл например : zzzz.rrr  
     
    Код:@echo off  
    for %%i in (q w e r t y u i o p a s d f g h j k l z x c v b n m ) do if not exist "%%i\:zzzz.rrr" if exist "%%i:\antivirus\curiet.exe" "%%i:\antivirus\curiet.exe"  

    Заработало!
    У тебя небольшая ошибка в орфографии "%%i\:zzzz.rrr" нужно "%%i:\zzzz.rrr". Я не сразу заметил
     
    Добавлено:
    Задача решена.
    Спасибо всем, особенно king_stiven
    спасибо большое, все четко, выручил.
     

    Всего записей: 438 | Зарегистр. 19-03-2009 | Отправлено: 22:06 02-11-2009 | Исправлено: mat86, 22:35 02-11-2009
    garri671



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

    Цитата:
    Доброго времени суток!  
    Извиняюсь за повтор прошения о помощи. Подскажите, плиз.  
    написал батник  
    chcp 1251>nul  
    for /f "tokens=*" %%A in (ad.txt) do (sc \\%%A config "symantec antivirus" start= auto & sc \\%%A start "symantec antivirus")  
    необходимо вывести результат в виде %%А - имя компа и прохождение команды. Все перепробовал...


    Всего записей: 133 | Зарегистр. 18-07-2007 | Отправлено: 07:54 03-11-2009
    saym101



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Подскажите как сделать в батнике что бы он смотрел какое сегодня число. Допустим сегодня первое число неважно какого месяца и года, то делаем то-то и продолжаем дальше. А если если не первое число то продолжаем делать дальше.
    Спасибо.

    Всего записей: 287 | Зарегистр. 16-04-2002 | Отправлено: 08:43 03-11-2009
    Gabzya



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    плс хелп
    есть флешка и есть сетевая папка, хочу создать батник, чтоб при запуске его
    копировались папки с данными с компа на флешку, причем заменялись ТОЛЬКО устаревшие файлы ( т.е. если на компе файлы менялись, то только они и переписываются)
     
    простое копирование это: xcopy H:\papka E:\papka
    но на каждый файл спрашивает заменить или нет, или все, но если выбрать все то это оч долго, а так чтоб только новые....
     
     
    Добавлено:
    например как у total commandera есть кн-ка "заменить более старые"
     
    PS xcopy-только для файлов? а если еще и каталоги нужно?

    Всего записей: 1149 | Зарегистр. 14-12-2004 | Отправлено: 09:53 03-11-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вопрос
    Нужно с помощью sed взять из файла 1.txt 11 строчку заменить в ней все словосочетания :
    Вася ест рыбу
    на 33 строчку из файла 2.txt, результат вставить на 4 строчку файла 3.txt, или просто в файл вывести  
     
    Gabzya
    xcopy довольно капризная команда если есть возможность заменить на xxcopy, а так почитать справку  
    xcopy /?

    Цитата:
    а если еще и каталоги нужно?

    скопировать папку 1 в папку 2 с файлами подкаталогами:
    xcopy 1 2/1 /i /S /E /H /Y /D /R
     
      /D:m-d-y     Копирует файлы, измененные либо в указанный день, либо после.
                   Если дата не указана, копируются только те файлы,
                   которые новее в исходной папке.
      /Z           Копирует сетевые файлы с возобновлением.

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 10:45 03-11-2009
    Maqentaer



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    предпочитаю дату брать через такое:

    Код:
    for /f "skip=1" %%i in ('wmic os get LocalDateTime') do set datetime=%%i
    set year=%datetime:~2,2%
    set fullyear=%datetime:~0,4%
    set month=%datetime:~4,2%
    set day=%datetime:~6,2%
     
    set hour=%datetime:~8,2%
    set minute=%datetime:~10,2%
    set second=%datetime:~12,2%

    так как полностью не зависит от локали и региональных настроек системы.
    и по сему далее:
     
    saym101

    Цитата:
    Подскажите как сделать в батнике что бы он смотрел какое сегодня число. Допустим сегодня первое число неважно какого месяца и года, то делаем то-то и продолжаем дальше. А если если не первое число то продолжаем делать дальше.  
    Спасибо.

    вот мое решение:

    Код:
     
    for /f "skip=1" %%i in ('wmic os get LocalDateTime') do set datetime=%%i
    set day=%datetime:~6,2%
    if "%day%" == "01" (
    rem делаем что-то, так как сегодня первое число.
    )
    rem продолжаем
     

    если тебе нужно сравнивать числа на больше/меньше, то нужно убирать предшествующие нули из цифр, так как они будут считаться за восьмеричные.
    это можно сделать примерно так:

    Код:
     
    if "%day:~0,-1%" == "0" set day=%day:~1,1%
     

    Всего записей: 71 | Зарегистр. 18-05-2008 | Отправлено: 12:32 03-11-2009 | Исправлено: Maqentaer, 14:56 03-11-2009
    saym101



    Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Maqentaer
    спасибо. то что надо.




    спасибы — в ПМ

    Всего записей: 287 | Зарегистр. 16-04-2002 | Отправлено: 13:07 03-11-2009 | Исправлено: vu1tur, 14:31 03-11-2009
    mugil_cephalus

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

    Цитата:
    передача аргументов через call:  
       ...  
    call :_1 "%%A"    
    goto :eof    
       
    :_1    
    if /i "%~1" equ "A:\" команда  
    ...  
    либо  
       ...call :_1 %%A    
    goto :eof    
       
    :_1    
    if /i "%1" equ "A:\" команда  
    ...

     
    я про это раньше и писал:

    Цитата:
    имхо, у меня код глючит на первой строке - do call :_1 "%A" - походу здесь нужно без кавычек,

    я знал как от них избавится (проблема была в другом), но все равно спасибо за рекомендации
     
    2 all
     
    хорошо вы все "выпытали" у mat86 задачу, мне и в голову не приходило, что там так все "закручено" (я предполагал о дополнительном наличии CD-дисков в CD/DVD-ROM'ah у endusers помимо flash'ki и разную конфигурацию workstationsov)  
     
     
    Rush
    king_stiven
    mat86
    wolf0425
     
    я нашел ошибку в своем коде (правда поздно - вчера я был oofline, зато читал booki):
     

    Цитата:
    @echo off  
    for /f "tokens=*" %%A in ('fsutil fsinfo drives') do call :_1 "%%A"  
    goto :eof  
     
    :_1  
    if /i "%1" equ "A:\" goto :eof  
    if /i "%1" equ "B:\" goto :eof  
    for /f "tokens=*" %%A in ('fsutil fsinfo drivetype %1 ^| findstr /v /i Неизвестный корневой Жесткий сетевой Компакт Электронный') do echo %%A && if exist "%1antivirus\curiet.exe" "%1antivirus\curiet.exe" >nul 2>&1  
    goto :eof

     
    нужно 1) tokens=2-26 (в первом for) ... 2) do call :_1 "%%A"  - без кавычек  
    for /f "tokens=2-26" %%B in ('fsutil fsinfo drives') do call :_1 %%B%%C%%D%%E%%F...  
    3) и если всбрыкнет скрипт во втором for - fsutil fsinfo drivetype X:\ - то "отрезать" backslash

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 14:08 03-11-2009
    king_stiven

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

    Цитата:
    хорошо вы все "выпытали" у mat86 задачу,  

    Сам когда то тут с нуля учился и вопросы задавал.
    Мой вопрос по sed актуален . смотреть выше.

    Всего записей: 2232 | Зарегистр. 17-07-2006 | Отправлено: 15:45 03-11-2009
    mugil_cephalus

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

    Цитата:
     смотреть выше.

    yes , sir
    я sed'om не пользуюсь
     

    Цитата:
     взять из файла 1.txt 11 строчку

     
    for /f "skip=10 tokens=* delims=$" %%A ('type 1.txt') do set "var=%%A" - что-то такое... (но это, конечно, для мазохистов, а так - sed, конечно...)

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

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    вопрос такой:
     
    как написать батник для того, чтобы строки из файла D:\1.txt были скопированы в файл D:\2.txt.смысл примерно такой: в файле 1.txt и в файле 2.txt содержатся строки, которые начинаются на qwerty1, qwerty3, qwerty4. Выглядит это так:
     
    qwerty1 78689, 78689
    qwerty2 75367, 75367
    qwerty3 56868, 56868
     
    нужно чтобы все строки файла 1 заменили соответствующие, начало которых соответствует началу строчек из файла 1, строки файла 2. причем в файле 2.txt много строчек, начинающихся с qwerty, а далее имеющие разные номера - qwerty1, qwerty2, qwerty4, qwerty6 и так далее - и эти строчки, не имеющего общего номера с файлом 1 должны остаться в неизменном виде
     
     
    например: если файл 1 состоит из  
     
    qwerty4 78689, 78689
    qwerty78 75367, 75367
    qwerty899 56868, 56868
     
     
    а файл 2 состоит из:
     
    qwerty1 12837, 12328
    qwerty4 75400, 75400
    qwerty78 75400, 75400
    qwerty899 55400, 55400
     
    то после операции c батником файл 2 должен выглядеть так:
     
    qwerty1 12837, 12328
    qwerty4 78689, 78689
    qwerty78 75367, 75367
    qwerty899 56868, 56868
     
    таким образом, строчки файла 1.txt, начинающиеся с qwerty4, qwerty78, qwerty899 заменили строчки файла 2.txt, начинающиеся с qwerty4, qwerty78, qwerty899
     
    извините если немного запутанно объяснил, только учусь...

    Всего записей: 2 | Зарегистр. 27-10-2009 | Отправлено: 16:18 03-11-2009
    mugil_cephalus

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

    Цитата:
    Мой вопрос по sed актуален  

    посм. - XXXXL  http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=480#21 и до http://forum.ru-board.com/topic.cgi?forum=5&topic=25393&start=520#19  
     
    p.s.
    еще - http://forum.ru-board.com/topic.cgi?forum=62&topic=10650&start=520
     
    p.p.s.
    чувствую wolf0425 мне такое
    Цитата:
    (но это, конечно, для мазохистов, а так - sed, конечно...)
    "на тормозах не спустит"....      

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 16:35 03-11-2009 | Исправлено: mugil_cephalus, 20:57 03-11-2009
    Rush

    Уже за тридцать...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    rrrfivefivefiverrr
    Как-то так?

    Код:
    @echo off
    for /f "tokens=1*" %%a in (2.txt) do set s=%%a & set v=%%b & call:search
    del 2.txt & rename 3.txt 2.txt
    goto:eof
     
    :search
    for /f "tokens=*" %%k in ('findstr "%s%\>" 1.txt') do (echo %%k>> 3.txt & goto:eof)
    echo %s% %v%>> 3.txt
     
    А тебе обязательно надо батник? По сравнению с vbs он жутко медленный.

    Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 20:57 03-11-2009
    mugil_cephalus

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

    Цитата:
    Код:@echo off  
    for /f "tokens=1*" %%a in (2.txt) do set s=%%a & set v=%%b & call:search  
    del 2.txt & rename 3.txt 2.txt  
    goto:eof  
     
    :search  
    for /f "tokens=*" %%k in ('findstr "%s%\>" 1.txt') do (echo %%k>> 3.txt & goto:eof)  
    echo %s% %v%>> 3.txt  

     
    синтаксически, все оказывается достаточно прозаически/несложно, чем представлялось...
     
    и без помощи sed'a можно решать подобные задачи, причем без громоздкого скрипта и достаточно эффективно.....

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 21:27 03-11-2009
    Rush

    Уже за тридцать...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    mugil_cephalus
    Ты скорости работы не учитываешь.
    На довольно маленьких файлах батник будет в даун надолго, а то и совсем.
     
    Причем sed или vbs на тот же файл потратят максимум пару-тройку секунд.

    Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 21:53 03-11-2009
    Ortios



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

    Цитата:
    Нужно с помощью sed взять из файла 1.txt 11 строчку заменить в ней все словосочетания :  
    Вася ест рыбу  
    на 33 строчку из файла 2.txt, результат вставить на 4 строчку файла 3.txt, или просто в файл вывести

    Вот набросал. Использовал валявшийся под рукой sed-3.59.

    Код:
    sed "33!d" 2.txt >str.txt
    set /p zamena=<str.txt
    sed "11 s#\(Вася ест рыбу\)\{1,\}#%zamena%#g"  1.txt | sed "11!d">file.txt
     

    Всего записей: 73 | Зарегистр. 24-12-2007 | Отправлено: 22:26 03-11-2009 | Исправлено: Ortios, 22:29 03-11-2009
    rrrfivefivefiverrr

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Rush
    Если можно действительно что-то подобное написать на VBS то буду очень благодарен, действительно батник сильно тормозит при переборе большего количества строк

    Всего записей: 2 | Зарегистр. 27-10-2009 | Отправлено: 23:03 03-11-2009
    Rush

    Уже за тридцать...
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    rrrfivefivefiverrr
    Проверить не на чем, но должен работать более-менее удовлетворительно по скорости.
    Я там таймер для проверки вставил. Его можно убрать после тестов.

    Код:
     
    dim fso, f, arrtxt, arrtxt2, arrline, compstr, n
    '********* start timer ***************
    dim starttimer, stoptimer
    starttimer = time
    '**********************************
    set fso = createobject("scripting.filesystemobject")
    set f = fso.opentextfile("d:\1.txt")
    arrtxt = split(f.readall, vbcrlf)
    f.close
    set f = fso.opentextfile("d:\2.txt")
    arrtxt2 = split(f.readall, vbcrlf)
    f.close
    for n = 0 to ubound(arrtxt2)  
        arrline = split(arrtxt2(n))
        if ubound(arrline) > -1 then  
           compstr = filter(arrtxt, arrline(0) & " ", true)
           if ubound(compstr) > -1 then arrtxt2(n) = compstr(0)
        end if
    next
    set f = fso.opentextfile("d:\2.txt", 2)
    f.write join(arrtxt2, vbcrlf)
    f.close
    '*********** stop timer ****************
    stoptimer = time
    msgbox "Время: " & cstr(stoptimer - starttimer) & " сек."
    '*************************************
     

    Всего записей: 3551 | Зарегистр. 20-11-2003 | Отправлено: 10:37 04-11-2009 | Исправлено: Rush, 13:32 04-11-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