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

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

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

vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 11:54 27-04-2007 | Исправлено: Elroir, 03:59 10-09-2007
    wolf0425



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

    Цитата:
    Но все равно с dir имно неудобно огород городить.  

    неудобно дракона трахать - хвост мешает
     
    for /f "tokens=*" %%a in ('dir /b /o-d /a-d \\server\share\*.*') do set "lastfile=%%a" && goto :exitfor
     
    полный список бэкапов на сервере всё равно же придется чем-то генерить...
     
    а вот список серверов/шар - можно и в файлик, и ещё for снаружи на их перебор.
     
    Добавлено:
    Maza Faka
    Set BackUp=\\comp1\c\BackUp \\comp1\d\BackUp  
    Dir /b /s /a:-d /o:-d %BackUp%
    выдаст сначала все файлики \\comp1\c\BackUp в сортировке по дате, потом все файлики \\comp1\d\BackUp  
     
    ты уверен, что именно такого результата хотел?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 11:27 16-05-2007 | Исправлено: wolf0425, 11:38 16-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    Ну вот
    Цитата:
    какая нафиг разница - пути или параметра - "строку с кавычками внутри (строки)"

    Насколько я понял:

    Код:
     
    reg add HKLM\SOFTWARE\MyPROG\Prog /v """Da"""ta""" /t REG_SZ /d 123
     

    Просто утраиваем кавычки и в итоге в реестре параметр "Data" будет выглядеть так: ("Da"ta")
     
    Добавлено:

    Цитата:
    Set BackUp=\\comp1\c\BackUp \\comp1\d\BackUp  
    Dir /b /s /a:-d /o:-d %BackUp%  
    выдаст сначала все файлики \\comp1\c\BackUp в сортировке по дате, потом все файлики \\comp1\d\BackUp  
     
    ты уверен, что именно такого результата хотел?

    Не так понял, ошибся

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 11:49 16-05-2007 | Исправлено: Maza Faka, 11:53 16-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Всем доброго времени суток.
    Помогите решить задачку: Имеется файл-список "C:\DOCUME~1\Evgenij\LOCALS~1\Temp\CMD4F99.tmp", например,
    примерно такого содержания
    Цитата:
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath\
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Realtek AC97 Audio Drivers v5.10.00.5970\
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\InstallPath 07.05.16 11-35.res
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\Archive 07.05.15 15-32.7z
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\0test 07.05.15 13-18.7z
    D:\DISTRIBUT 1\7-Zip\1_7zSD_test\archiVE.7z
    В нем могут быть и только папки, и только файлы, и то и другое вместе. Количество записей в этом файле от 1 до ... ну много вобщем .
    Задача: выделить в переменную %soursepart% путь к папке источнику т.е. D:\DISTRIBUT 1\7-Zip\1_7zSD_test\ в данном примере.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 11:59 16-05-2007 | Исправлено: GORA2, 12:05 16-05-2007
    wolf0425



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

    Цитата:
     Задача: выделить в переменную %soursepart% путь к папке источнику т.е. D:\DISTRIBUT 1\7-Zip\1_7zSD_test\


    Код:
    @echo off  
    setlocal enabledelayedexpansion
     
    for /f "tokens=*" %%a in ('type files.txt') do set "soursepart=%%~dpa" & goto :_dirname
    :_dirname
    type files.txt | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
     
    Set soursepart

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 12:36 16-05-2007 | Исправлено: wolf0425, 13:00 16-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Что то не получается. Может потому что я немного изменил!?
    Код:
    @echo off
    echo %%~1    = %~1
    setlocal enabledelayedexpansion
     
    for /f "tokens=*" %%a in ('%~1') do set "soursepart=%%~dpa" & goto :_dirname
    :_dirname  
    type files.txt | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
     
    Set soursepart
     
    pause>nul
    Вижу в консоли
    Цитата:
    %~1     = C:\DOCUME~1\Evgenij\LOCALS~1\Temp\CMD4FE2.tmp
    Не удается найти указанный файл.
    Переменная среды soursepart не определена
    Плюс к этому еще и "ненайденый" файл запускается в редакторе. Что у меня не так?

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 13:25 16-05-2007
    slayer120



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

    Цитата:
    полный список бэкапов на сервере всё равно же придется чем-то генерить

     Зачем, я ж писал бакапы  на нескольких серваках лежат по одному на разных винтах
    и чем тебе здесь dir поможет?  Построит список из одного файла?
    Потом dir в список путь не выводит (только имена) - надо ручками добавлять.
      да и файлов не так много по количеству -от 3 до 6 на серваке быстрее ручками список сделать чем с батником возится

    Всего записей: 303 | Зарегистр. 24-01-2007 | Отправлено: 13:27 16-05-2007
    euheny



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

    Цитата:
    """Da"""ta"""

    Цитата:
    будет выглядеть так: ("Da"ta")

    ну и примерчик , этож кому это понадобится ?
    логичнее предположить то что будет выглядеть так
     
       "Data" - it my data

    Всего записей: 4060 | Зарегистр. 22-11-2006 | Отправлено: 13:31 16-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Все разобрался! Сам был не прав. Вам спасибо.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 13:45 16-05-2007
    Maza Faka



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

    Цитата:
    ну и примерчик , этож кому это понадобится ?


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

    Код:
     
    @Echo off
    Reg add HKLM\Software\MyProgs\Program /v """"Data""" - it my data" /t REG_SZ /d Test
     

     
    Добавлено:
    wolf0425

    Цитата:
    @echo off    
    setlocal enabledelayedexpansion  
     
    for /f "tokens=*" %%a in ('type files.txt') do set "soursepart=%%~dpa" & goto :_dirname  
    :_dirname  
    type files.txt | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname  
     
    Set soursepart

     
    Я сразу и не разобрался, как это работает. Респект! Красивое решение!
     
    P.S.
    Какой у тебя номер аськи?

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 13:53 16-05-2007
    wolf0425



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

    Цитата:
    Зачем, я ж писал бакапы  на нескольких серваках лежат по одному на разных винтах

    но позже ты сказал что 1сервер=1шара с бэкапами

    Цитата:
    Потом dir в список путь не выводит (только имена) - надо ручками добавлять.  

    почему это не выводит? именно полный путь dir /b /s и выводит, руками добавлять ничего не надо. UNC тоже нормально выводит.
     

    Цитата:
    да и файлов не так много по количеству -от 3 до 6 на серваке быстрее ручками список сделать чем с батником возится

    и что, такой сделанный сегодня ручками список - кому-то будет нужен через неделю?
    там что - имена бэкапов не автогенерятся,  а всё время одинаковые???
     
    откуда при этом возьмутся более новый бэкап на другом диске, но со старым именем?
    если список можно руками составить один раз - то откуда взялся вопрос сравнения дат: их же тоже можно глазами сравнивать...
     
    Maza Faka
    скорее уж будет  
    Reg add HKLM\Software\MyProgs\Program /v Testname /d """"Data""" - it my data"
     
    GORA2
    for /? прочти наконец. подумай - что ж ты поменял.
    for /f "tokens=*" %%a in ('%~1')
    предполагает что %1 - исполняемый файл, stdout которого ты хочешь обработать.  
    в оригинале stdout генерил 'type files.txt' - причем в ДВУХ местах командника.
     
    если %1 = имя файла-списка - замени в оригинале type files.txt на type %1 или на type "%~1"  
    можно и без type написать оба места, непосредственно указывая файла в for и find - но с type достаточно RO доступа к файлу и атрибуты не волнуют. иногда полезно.
     
    Добавлено:
    Maza Faka

    Цитата:
    Какой у тебя номер аськи?  

    какая разница, если на работе её использовать запрещено?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 14:48 16-05-2007 | Исправлено: wolf0425, 14:51 16-05-2007
    Maza Faka



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

    Цитата:
    какая разница, если на работе её использовать запрещено?

    А дома?
     
    Кстати, я тебе в личку писал, ты наверное не заметил?

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 14:59 16-05-2007
    slayer120



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

    Цитата:
    там что - имена бэкапов не автогенерятся,  а всё время одинаковые???  

      да вот так все запущено .  

    Цитата:
    откуда при этом возьмутся более новый бэкап на другом диске, но со старым именем?  
    если список можно руками составить один раз - то откуда взялся вопрос сравнения дат  

      Просто часть серваков старых , много маленьких (80Г) винтов, бакапы пишутся на разные винты локально. На новых пишутся в один каталог. Система типа такая
    в понедельник -file1, потом file2 и т.д. Имена не меняются. Смысла добавлять дату в имя не вижу - все равно не уместится больше файлов.  
       А так в бекапе стоит -переписывать старый файл. Бакап полный (систем стате плюс файлопомойка). С инкрементными теперь не связываюсь - не раз обжигался.
       
     
    Цитата:
    их же тоже можно глазами сравнивать...

      вопрос стоял чтоб автоматом копировать последний по времени файл. А так можно тупо прописать в список
    по 1 любому бакапу с каждого сервера и копировать. Займет три строчки.

    Всего записей: 303 | Зарегистр. 24-01-2007 | Отправлено: 15:36 16-05-2007 | Исправлено: slayer120, 15:42 16-05-2007
    GoreZ2007

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Преамбула: при распаковке архива rar (primer.exe SFX) запускаю батник, который его удаляет, но т.к. архив не успевает вовремя выгрузиться из памяти, то возникает сообщение "отказано в доступе". Выхожу из положения тем, что в цикле все время пытаюсь удалить и , когда все ОК выхожу.
      :metka
      del primer.exe
      if exist primer.exe goto metka
    Амбула или вернее вопрос:
      Как сделать так, чтобы не выводилось сообщение "отказано в доступе"? Или может знатоки подскажут как сей алгоритм сделать изящнее?

    Всего записей: 1 | Зарегистр. 16-05-2007 | Отправлено: 15:55 16-05-2007
    wolf0425



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

    Цитата:
    в понедельник -file1, потом file2 и т.д. Имена не меняются. Смысла добавлять дату в имя не вижу - все равно не уместится больше файлов.  


    Цитата:
    вопрос стоял чтоб автоматом копировать последний по времени файл. А так можно тупо прописать в список по 1 любому бакапу с каждого сервера и копировать.

    так достаточно по одному любому (из 5-7) или же надо в момент запуска батника выяснять, кто из этих 7 писался последним - ты уж для себя выбери что-то одно, потом спрашивай
     

    Цитата:
    бакапы пишутся на разные винты локально.

    это как - на разные винты сервера1 пишутся разные куски его бэкапа, или один и тот же, выбирая место по RND?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 16:01 16-05-2007
    Maza Faka



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

    Код:
     
    @Echo off
    Rar.exe e myArchive.exe C:\MyFolder
    del /q /f myArchive.exe
     

     
    Либо в своём методе перенаправляй ошибку удаления в NUL:
    del /q /f myArchive 2>NUL

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 16:14 16-05-2007 | Исправлено: Maza Faka, 16:20 16-05-2007
    GORA2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    Рано я обрадовался. Не совсем то, что я просил. Вот то, что сейчас у меня:
    Код:
    @echo off
    setlocal enabledelayedexpansion
    set partlistfile="%~1"
    CHCP 1251>nul
    for /f "tokens=*" %%a in ('type %partlistfile%') do set "soursepart=%%~dpa" & goto :_dirname
    :_dirname  
    type %partlistfile% | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
    CHCP 866>nul
    Set soursepart
    pause>nul
     
    Это верно работает, если в файл-списке есть файл(ы), а если папка и только ОДНА то soursepart содержит путь+имя данной папки.
    И если можно, очень бы хотелось еще переменную soursename с именем (без пути) папки или файла из файл-списка, если в файл-списке только один файл или папка соответственно. Т.е. если только одна запись.

    Всего записей: 1271 | Зарегистр. 26-01-2006 | Отправлено: 16:35 16-05-2007
    wolf0425



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

    Цитата:
    Не совсем то, что я просил.

    вообще-то просил ты именно что получил. другой вопрос - может хотел по-другому

    Цитата:
    Это верно работает, если в файл-списке есть файл(ы), а если папка и только ОДНА то soursepart содержит путь+имя данной папки.

    вообще-то так и задумывалось - найти наибольший общий путь...

    Цитата:
    И если можно, очень бы хотелось еще переменную soursename с именем (без пути) папки или файла из файл-списка, если в файл-списке только один файл или папка соответственно. Т.е. если только одна запись.

    если заведомо надо получить путь + имя раздельно,  
    а не максимальный общий путь - второй цикл будет таким

    Код:
    :_dirname
    if "!soursepart:~-1!"=="\" set "soursepart=!soursepart:~0,-1!"
    for /f "tokens=*" %%a in ("!soursepart!") do set "soursename=%%~nxa" && set "soursepart=%%~dpa"  
    type %partlistfile% | find /v "!soursepart!" >nul && goto :_dirname

    soursename - имя.ext первой строки файла, независимо от того файл там или папка, если строка единственная.
    если строка не единственная - то промужуточный мусор обработки. сойдет?
     
    если действительно надо строки посчитать
    for /f %%a in ('type %partlistfile% ^| find /v /c ""') do if %%a equ 1 echo единственная строка
     
    я вот тут задумался - а могут ли быть в задуманном тобой списке файлы/папки разной вложенности? т.e. вида  
    d:\temp\1\
    d:\temp\2\3.zip
    если нет, и все файлы/каталоги списка имеют тот же путь, что и первый файл/каталог - почти половина батника лишняя...

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 17:49 16-05-2007 | Исправлено: wolf0425, 18:56 16-05-2007
    slayer120



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

    Цитата:
    это как - на разные винты сервера1 пишутся разные куски его бэкапа, или один и тот же, выбирая место по RND?  

       Не на разные винты пишутся одинаковые бакапы но по разным дням на разные винты
    (на 80 архив 30-40 гб тока раз помещается)  
    Цитата:
    один и тот же, выбирая место по RND?  

    мне надо было
    Цитата:
     в момент запуска батника выяснять, кто из этих 7 писался последним


     виноват, мутно объяснил задачу Спасибо всем за помощь !
     

    Всего записей: 303 | Зарегистр. 24-01-2007 | Отправлено: 17:56 16-05-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    GORA2
    Вот накарябал, как смог, получилось некрасиво, но работает:

    Код:
     
    @Echo off
    setlocal enabledelayedexpansion
     
    for /f "delims=: tokens=1*" %%a in ('find /v /c "" files.txt') do (
    if %%b EQU 1 (
    for /f "tokens=*" %%b in (files.txt) do (
    Set "soursename=%%b"
    set soursename=!soursename:~0,-1!
    Call :Name "!soursename!")) Else (goto :Begin)
    )
    Goto :EOF
     
    :Name
    Set soursename=%~nx1
    Set soursename
    Goto :EOF
     
    :Begin
    @echo off
    setlocal enabledelayedexpansion
    set partlistfile=Files.txt
    CHCP 1251>nul
    for /f "tokens=*" %%a in ('type %partlistfile%') do set "soursepart=%%~dpa" & goto :_dirname
    :_dirname
    type %partlistfile% | find /v "!soursepart!" >nul && for /f "tokens=*" %%a in ("!soursepart:~0,-1!") do set "soursepart=%%~dpa" & goto :_dirname
    CHCP 866>nul
    Set soursepart
     

    Можно сделать красивее, но из-за концевых слешей в именах папок, много гимора, отсюда и некрасивый код...

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 18:09 16-05-2007 | Исправлено: Maza Faka, 18:21 16-05-2007
    NIKZZZZ



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

    Код:
    echo off
    Set  TempDate=00000000
    Set ResultName=
    for /f "tokens=*" %%i in (files.txt) do (
      for /f "tokens=1-5 delims=.: " %%j in ("%%~ti") do   call :_1  %%l%%k%%j%%m%%n %%i
    )
    echo Result - %ResultName%  Date -  %TempDate%
    Rem copy %ResultName% КудыНадо
    goto :eof
     
    :_1
    if  X%1 GTR X%TempDate% (
      Set ResultName=%2
      Set TempDate=%1
    )

     
    X%TempDate%  - X добавлен, чтобы %TempDate% не интерпретировалось как число, а то оно за границы диапозона выходит.
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 19:39 16-05-2007 | Исправлено: NIKZZZZ, 19:50 16-05-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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 3
    vu1tur (11-09-2007 15:22): продолжаем в теме Задачи на bat-файлах 4


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru