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

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

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

vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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-файлах (часть 1)
Вопросы, задачи и их решения по работе с командными файлами, а также сопутствующие ссылки.

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 16:59 14-11-2006 | Исправлено: Elroir, 04:30 26-04-2007
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    JohnRD
    IF EXIST c:\1\a.txt  (del /q c:\1\a.txt)

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 12:06 17-03-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    igor_andreev Kirillhome
    круто даже не ожидал что так просто
    спасибо
     
    вот еще задача которая мешает мне спать..
    есть файл с номерами лицензий
    lic.csv

    Код:
    1111
    2222
    3333
    4444
    5555
    6666
     
    есть еще файл - уже с номерами и именами полученный инвентаризацией sms
    name-lic.csv

    Код:
    vasy;5555
    petya;3333
    fedya;0000  # это есть временный номер выданный на 30 дней при установке проги
    kolya;4444
    sasha;0000  # тоже временный номер, его нет в списке лицензий
    dima;1111

    нужно брать каждый номер (например 1111) из файла lic.csv проверять его наличие в другом файле name-lic.csv,если в нем такой есть, то нужно проверить все остальные чтобы такого же номера в файле name-lic.csv больше не было,если такой же встретиться еще - то заменить его на 0000, если взятого номера (например 2222) вобще не найдется в файле name-lic.csv то вставить его вместо первого попавщегося временного тоесть 0000.
     
    идея такая чтобы был файл с именами и уникальными номерами лицензий, который будет брабатываться другим скриптом для дальнейшей правки уже на каждом ПК.  
    вводили номера лицензий - люди(ручками) и порой забывали отметиь кому номер присвоили, далее я сам ставил прогу SMS сервером уже с временной лицензией... а рабочих станцийй более чем 2000
     
    спасибо за Вашу помощь
    заранее благодарен
    Евгений
     
     
     

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 16:30 17-03-2007
    Elroir



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

    Код:
     
    @echo off
    if exist name-lic.bak del /q name-lic.bak
    copy name-lic.csv name-lic.bak>nul
    setlocal enabledelayedexpansion
    for /f "tokens=1" %%a in (lic.csv) do (
     del /q tmp_lic 2>nul
     find "%%a" name-lic.csv>nul
     if !errorlevel!==0 (
      set "first_occurrence=yes"
      for /f "tokens=1,2 delims=; " %%b in (name-lic.csv) do (
       if %%c==%%a (
        if !first_occurrence!==yes (
         set "first_occurrence=no"
         echo %%b;%%c>>tmp_lic
        ) else (
         echo %%b;0000>>tmp_lic
        )
       ) else (
        echo %%b;%%c>>tmp_lic
       )
      )
     ) else (
      set "changed=no"
      for /f "tokens=1,2 delims=; " %%b in (name-lic.csv) do (
       if %%c==0000 (
        if !changed!==no (
         set "changed=yes"
         echo %%b;%%a>>tmp_lic
        ) else (
          echo %%b;%%c>>tmp_lic
        )
       ) else (echo %%b;%%c>>tmp_lic)
     )
     )
     del /q name-lic.csv
     ren tmp_lic name-lic.csv
    )
     

    Протестируй хорошенько, перед использованием на всех компах. На всякий случай, батник создает бекап файл name-lic.bak.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 20:05 17-03-2007
    Kirillhome



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    JohnRD
    А насколько уникальный номера лицензий (т.е. может ли содержать файл lic.csv строки, к примеру, 1111 и 11111 ????)

    Всего записей: 426 | Зарегистр. 23-11-2004 | Отправлено: 20:06 17-03-2007
    JohnRD

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir спасибо большое, буду проверять
     
    Kirillhome
    вот реальные лицензии, убраны пробелы для импорта в реестр
    в таком виде они будут в файле lic.csv
    DV3000000000UNFB0C9PBLLDL
    DV3000000000B91B65C6CMZKH
    DV3000000000ADHAM9AXKT6EV
    DV300000000002FCAARENAK8D
    DV3000000000LWB78XCHTQQ1V
    DV3000000000G4NPEQ8KA3G9U
     
    DV3000001000000005YHDZZVR - это временный номер

    Всего записей: 205 | Зарегистр. 29-08-2004 | Отправлено: 11:05 18-03-2007
    andy13nemo

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста скрипт для автоматического создания папок на диске следующим образом:
     
    Папка-1
    Папка-2
    Папка-3
    Папка-...
    и т.д.
     
    Заранее благодарю !

    Всего записей: 4 | Зарегистр. 22-06-2006 | Отправлено: 15:14 18-03-2007
    Elroir



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

    Код:
     
    @echo off
    setlocal
    chcp 1251>nul
    set "number=10"
    for /l %%a in (1,1,%number%) do md "Папка-%%a"
     

    В выделенной строчке меняешь число 10 на то, которое тебе нужно.

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 16:14 18-03-2007
    ssnvit

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Постановка задачи: источник - папки test1, test2, .... testn. В этих папках размещены файлы job1.txt,job2.txt,....jobm.txt. Необходимо скопировать папки test1 и т.д. в другое место на разделе диска с теми же названиями папок, но исключив из копирования те файлы *.txt, которые уже имеются в папках назначения. Те из файлов *.txt, имен которых нет в папках назначения, должны быть скопированы.

    Всего записей: 156 | Зарегистр. 05-12-2002 | Отправлено: 13:14 19-03-2007
    KapralBel



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ssnvit
    См. в сторону встроенной утилиты XCopy или RoboCopy от M$
    Позволяют делать зеркало папок
    XCopy - встроенная и простая
    RoboCopy - надо качать но зато очень мощная

    Всего записей: 11354 | Зарегистр. 16-02-2005 | Отправлено: 13:32 19-03-2007
    MegaSin

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    приветствую!
    Есть такая вот конструкция(просто для теста):

    Код:
     
    @echo off
    set mdquery=123 -h 12 --port=32 -u12 --password=32
    call :xz "%mdquery% -e "SELECT `name`,(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1177), ' ', -1)+0) AS `money`""
    pause
    goto :eof
    :xz
    echo %~1
    exit /b 0
    :eof
     

    никак не получается передать в в 1 аргументе ковычки...
    т.е вот эта конструкция выведет  
    123 -h 12 --port=32 -u12 --password=32 "SELECT  
    как передать ковычки чтобы получился полный вывод.... т.е  
    123 -h 12 --port=32 -u12 --password=32 "SELECT  `name`,(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1177), ' ', -1)+0) AS `money`"
    спс

    Всего записей: 25 | Зарегистр. 26-11-2006 | Отправлено: 15:52 19-03-2007 | Исправлено: MegaSin, 15:54 19-03-2007
    igor_andreev

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

    Всего записей: 1704 | Зарегистр. 08-12-2004 | Отправлено: 16:00 19-03-2007
    Maza Faka



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

    Цитата:
    Постановка задачи: источник - папки test1, test2, .... testn. В этих папках размещены файлы job1.txt,job2.txt,....jobm.txt. Необходимо скопировать папки test1 и т.д. в другое место на разделе диска с теми же названиями папок, но исключив из копирования те файлы *.txt, которые уже имеются в папках назначения. Те из файлов *.txt, имен которых нет в папках назначения, должны быть скопированы.

     
    Вот батник, число в строке "Set number=10" означает кол-во каталогов, измени на нужное тебе:
     

    Код:
     
    Set number=10
    For /L %%i in (1,1,%number%) do Xcopy C:\test%%i D:\test%%i /s /e /d
     

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 16:30 19-03-2007
    MegaSin

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

    Цитата:
    echo %*

    а если я передаю несколько аргументов? как быть?
    в идеале у меня это выглядит так  
     call :xz "%mdquery% -e "SELECT `name`,(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1177), ' ', -1)+0) AS `money`"" "init"
    т.е передаётся запрос который нужно выполнить, и на каком этапе он произошол..
    это для системы логирования

    Всего записей: 25 | Зарегистр. 26-11-2006 | Отправлено: 18:07 19-03-2007
    igor_andreev

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

    Цитата:
    а если я передаю несколько аргументов? как быть?

    Да как хошь можно. Разделить аргументы знаком, которого в них нет, слешем например.
     
    call :xz %mdquery% -e "SELECT `name`,(SUBSTRING_INDEX(SUBSTRING_INDEX(`data`, ' ', 1177), ' ', -1)+0) AS `money`"/init
    pause & goto :eof
     
    :xz
    for /f "tokens=1,2 delims=/" %%a in ('echo %*') do (set first=%%a&set second=%%b)
    echo first argument: %first%
    echo second argument: %second%
     
    Или enabledelayedexpansion использовать, чтоб не вызывать никаких меток. Решений много может быть.

    Всего записей: 1704 | Зарегистр. 08-12-2004 | Отправлено: 18:50 19-03-2007 | Исправлено: igor_andreev, 18:51 19-03-2007
    MegaSin

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

    Всего записей: 25 | Зарегистр. 26-11-2006 | Отправлено: 19:07 19-03-2007
    mamykin

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    что-то не получается так ни хрена. Надо по-другому

    Всего записей: 9 | Зарегистр. 19-03-2007 | Отправлено: 19:23 19-03-2007
    stegmatik



    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    помогите плиз.. из папки OUT в папку IN нада скопировать файлы с маской *.* вообщем все, но  как сделать, чтоб повторяющиеся файлы(в папку OUT они постоянно поступают(файлы с одинаковыми именами)) перемещались в папку  COPY ??

    Всего записей: 19 | Зарегистр. 14-03-2007 | Отправлено: 01:03 20-03-2007
    Elroir



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

    Код:
     
    @echo off
    for %%a in (out\*.*) do (
    if not exist "in\%%~nxa" (
    copy /y "%%a" in\ >nul
    ) else (
    move /y "%%a" copy\ >nul
    )
    )
     


    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 01:18 20-03-2007
    stegmatik



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

    Всего записей: 19 | Зарегистр. 14-03-2007 | Отправлено: 08:14 20-03-2007
    JonyRico

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ребят, очень уважаю вас как людей, разбирающихся в командой строке
     
    у меня возникла задача... в компе есть папка со множеством подпапок... во многих из них могут быть файлы, которые мне нужно удалить.
     
    как написать батник, чтобы он поверял все подпапки текущей папки и при наличии таковых файлов - удалял их?
     
    чобы было проще, о надо удалить во всех подпапках файл ...  forexample.doc
     
    заранее Вам спасибо
     
    P.S. 68 страниц не осилил....

    Всего записей: 2 | Зарегистр. 12-01-2007 | Отправлено: 12:27 20-03-2007
       

    Страницы: 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-файлах 2
    vu1tur (27-04-2007 11:55): продолжаем в теме «Задачи на bat-файлах 3»


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru