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

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

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

vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 17:45 04-09-2010 | Исправлено: Accessor, 18:04 28-09-2010
    01MDM



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


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 19:48 20-12-2010
    serg3001



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM, вот подробнее опишу на примере, прога посчитала мне всю сумму по числам в файле и выдала в результате 19,
     
    13
    2
    1
    3
     
    ещё я сверяюсь с контрольной суммой по всем числам, она например = 14
    вижу, что ошибка в первом случае произошла, результат больше на 5, теперь задача найти слагаемые из которых состоит 5 (2 и 3) и вывести их в файл допустим.

    Всего записей: 3681 | Зарегистр. 16-10-2010 | Отправлено: 20:00 20-12-2010
    Vladins

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Для резервного копирования рабочих файлов использую батник, который запускаю вручную несколько раз в течение дня:
     
    set CURDATE=%DATE%
    set CURTIME=%TIME%
    set VTIME=%time:~0,-6%
    set VTIME=%VTIME::=-%
    if not exist "C:\Documents and Settings\_copii" md "C:\Documents and Settings\_copii"
    if not exist "D:\temp" md "D:\temp"
    for %%i in (*.dwg) do (
    copy "%%i" "D:\temp"
    "c:\Program Files\1\7Zip\7z.exe" a -t7z -mx "C:\Documents and Settings\_copii\%CURDATE:~6,4%_%CURDATE:~3,2%_%CURDATE:~0,2% %~x1%VTIME% %%~ni.7z" "D:\temp\%%~ni.dwg"
    del "D:\temp\%%i"
    )
    exit
     
    Как сделать чтобы копировался только последний сохраненный файл (в папке находится несколько файлов dwg, нет смысла копировать те которые не обновлялись), т. е. чтобы по последнему времени изменения выбирался только один файл?

    Всего записей: 68 | Зарегистр. 22-05-2010 | Отправлено: 20:59 20-12-2010
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    serg3001
    Вот набросал. При условии, что заведомо только 2 слагаемых:

    Код:
     
    @echo off
    setlocal
     
    set "toFind=460.47"
    set "toFind=%toFind:.=%"
     
    for /f "tokens=4 delims=:" %%i in (1.txt) do call:set "%%i"
    for /l %%i in (1,1,%cnt%) do call:check "%%i"
    goto:eof
     
    :set
    set "num=%~1"
     
    set /a sums+=%num:.=%
    set /a cnt+=1
     
    set "n_%cnt%=%num:.=%"
    goto:eof
     
    :check
    set /a n=%~1+1
    for /l %%i in (%n%,1,%cnt%) do (
        
        for /f "tokens=2 delims==" %%x in ('set n_%%i') do (
            
            for /f "tokens=2 delims==" %%y in ('set n_%~1') do call:sum "%%x" "%%y"
        
        )
     
    )
    goto:eof
     
    :sum
     
    set "fst=%~1"
    set "scd=%~2"
     
    set /a sum=fst+scd
     
    if %sum%==%toFind% (
     
        echo %sums:~0,-2%.%sums:~-2%
        echo %fst:~0,-2%.%fst:~-2% %scd:~0,-2%.%scd:~-2%
     
    )
     
     


    ----------
    Вопросы в личке останутся без ответа

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 20:59 20-12-2010
    Lamman



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Задача такая: батник узнаёт текущую дату, приплюсовывает к ненй неделю и записывает в файл строку в формате %date% бла-бла-бла %date%+7 дней.
    Важно, что бы он при этом записывал адекватные значения дня, месяца и года (разумеется, месяц можно округлить, скажем до 30 дней).
     
    Для обработки даты написал... нечто, вот только оно увы, не работает.
    А именно, почему-то после for значения %%a, %%b, %%c недоступны.

    Код:
     
    @echo off
    for /f "tokens=1,2,3 delims=." %%a in ('date /t') do (goto day)
    ay
    if /i %a leq 23 ((set /a a+=7) && (goto month)) else ((
    set a=0) && (goto day))
     
    :month
    if /i %a leq 7 ((set /a b+=1) && (goto year)) else (
    goto year)
     
    :year
    if /i %b leq 12 (goto step) else ((
    set b=0) && (set /a c+=1) && (goto month))
     
    :step
    @echo %a %b %c
     

     
    Попробовал так:

    Код:
     
    @echo off
    for /f "tokens=1,2,3 delims=." %%a in ('date /t') do (((
    set dd=%%a) && (
                    set mm=%%b) &&(
                                   set yy=%%c)) && (
                                                    goto day))
    ay
    if /i %dd% leq 23 ((set /a dd+=7) && (goto month)) else ((
    set dd=0) && (goto day))
     
    :month
    if /i %dd% leq 7 ((set /a mm+=1) && (goto year)) else (
    goto year)
     
    :year
    if /i %mm leq 12 (goto step) else ((
    set mm=0) && (set /a yy+=1) && (goto month))
     
    :step
    @echo %dd% %mm% %yy%
     

    ... не помогло.
     
    В чём тут может быть дело?..
    И есть ли более простой способ проделать означенную операцию с датой?..
     
    Попробовал переходить на метки через конструкцию
    call:day "%%a" "%%b" "%%c"
    тоже ничего.
    Ещё один вопрос: как корректно перейти от %%x в %x% из for в set?

    Всего записей: 22 | Зарегистр. 23-04-2010 | Отправлено: 21:10 20-12-2010 | Исправлено: Lamman, 21:59 20-12-2010
    wolf0425



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

    Цитата:
    А именно, почему-то после for значения %%a, %%b, %%c недоступны.  
    потому что они определены только внутри цикла - после do

    Код:
    for /f "tokens=1,2,3 delims=." %%a in ('date /t') do (
        set dd=%%a
        set mm=%%b
        set yy=%%c
    )
    если без извратов с &&
    но каких-то особых преимуществ перед вырезаниями подстрок из %date% - такой разбор for не имеет, если уж чего мутить - то раздергать вывод wmic os get LocalDateTime - он хоть от  настроек ОС не зависит.
     

    Цитата:
    И есть ли более простой способ проделать означенную операцию с датой?..  

    cmd для обсчета дат не приспособлен - замучаешься високосные годы и прочие тонкости учитывать, лучше посмотри по теме гибрид с vbs или яваскриптом, например вот, -1 на +7 наверно найдешь где поменять...
     
     

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 08:18 21-12-2010 | Исправлено: wolf0425, 08:23 21-12-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Lamman
    В очередной раз прорекламируюсь - постил в этой ветке батник переводящий дату/время в секунды от начала эпохи и обратно, там учитываются високосные года, дни месяца и проч.
    Поищи в версии для печати, думаю для твоей задачи как раз сгодиться.
    Но кода там довольно много, на vbs/js это будет все гораздо короче.
     
    Добавлено:
    Vladins
    Для копирования файлов используй xcopy с параметром /M и будет тебе счастье.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:00 21-12-2010
    DoctorAlex

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Народ помогите.
    Такая задача.
     
    нужно выдернуть IP адрес локальной машины из ipconfig (127.0.0.1 не нужно, нужен статический или динамический) и подставить его в программа.exe %IP%
     
    что то вроде
     
    ipconfig | findstr IP
    программа.exe %IP%
     
    спасибо, решение нашол
    -----------
    set "ipstr="
    for /f "tokens=2 delims=:" %%a in ('netsh interface ip show address ^| findstr "IP-" ') do (
        for /f %%b in ("%%a") do set "ipstr=!ipstr!;%%b"
    )
    set "ipstr=%ipstr:~1%"
    -----------

    Всего записей: 86 | Зарегистр. 08-02-2006 | Отправлено: 12:37 21-12-2010 | Исправлено: DoctorAlex, 15:05 21-12-2010
    res2001



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

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 12:57 21-12-2010
    Vladins

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001
    Можно пример для резервного копирования
    Цитата:
    xcopy с параметром /M  
    ?
     
     
     
    Добавлено:
    И еще: в том же батнике (20:59 20-12-2010) формат дата время в имени файла выводится в виде 2010_12_21 8-00. А для того чтоб файлы сортировались в алфавитном порядке нужно 2010_12_21 08-00. Для этого в региональных настройках выставил формат отображения времени "без подавления нулей", часы стали отображать 08-00 вместо 8-00, а названия заархивированных файлов остались в формате 0-00. Как добавить ноль в имена файлов?

    Всего записей: 68 | Зарегистр. 22-05-2010 | Отправлено: 22:43 21-12-2010
    wolf0425



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

    Цитата:
    Как добавить ноль в имена файлов?
    в %vtime% заменить пробел на 0
     
    ну и какие у тебя проблемы переставить части %curdate% как тебе надо - мне не понять...

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 08:27 22-12-2010 | Исправлено: wolf0425, 08:28 22-12-2010
    res2001



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

    Цитата:
    Можно пример для резервного копирования  

    Дык заменяешь в батнике copy на xcopy /m вот и все. Какой тебе пример еще нужен?
    Почтиай xcopy /?.
    Суть в том что ключ /m указывает xcopy копировать файлы с установленным атрибутом "архивный" и после копирования сбрасывать его. Когда файл изменяется, этот атрибут автоматически устанавливается, таким образом получаешь копирование только измененных файлов.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 08:56 22-12-2010
    Vladins

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    res2001  
    Работает, однако если файл не изменялся, то копирование не происходит, а нужно чтобы копирование происходило в любом случае. Есть ли еще методы выбора файлов по дате?

    Всего записей: 68 | Зарегистр. 22-05-2010 | Отправлено: 19:03 22-12-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vladins
    Цитата:
    чтобы по последнему времени изменения выбирался только один файл?

    dir /O:-D /T:W /a:-d /b
    начни с этого

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 19:58 22-12-2010
    Vladins

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Получил список файлов с помощью dir /O:D /T:W /a:-d /b *.dwg
    А как сделать какие либо операции (копирование или архивирование) с последним (или первым) файлом из списка?

    Всего записей: 68 | Зарегистр. 22-05-2010 | Отправлено: 22:24 22-12-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
                           ...
    if not exist "D:\temp" md "D:\temp"
    for /f "delims=" %%i in ('dir /O:D /T:W /a:-d /b *.dwg') do (
    copy "%%i" "D:\temp"
    "c:\Program Files\1\7Zip\7z.exe" a -t7z -mx "C:\Documents and Settings\_copii\%CURDATE:~6,4%_%CURDATE:~3,2%_%CURDATE:~0,2% %~x1%VTIME% %%~ni.7z" "D:\temp\%%~ni.dwg"
    del "D:\temp\%%i"
    exit
    )

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 00:14 23-12-2010
    wolf0425



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

    Всего записей: 2920 | Зарегистр. 25-04-2007 | Отправлено: 02:17 23-12-2010
    BVV63



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    XCopy ... /T /O
    Копирует структуру папок и сохраняет их владельца и разрешения. Файлы не копируются.

    Всего записей: 3542 | Зарегистр. 17-08-2009 | Отправлено: 05:39 23-12-2010 | Исправлено: BVV63, 05:40 23-12-2010
    Vladins

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    Архивирует подряд все dwg файлы...

    Всего записей: 68 | Зарегистр. 22-05-2010 | Отправлено: 18:55 23-12-2010
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Vladins
     
    такой код у меня работает
    for /f "delims=" %%i in ('dir /O:D /T:W /a:-d /b *.dwg') do (
       copy "%%i" "D:\temp"
       exit
    )

    Всего записей: 2167 | Зарегистр. 17-07-2006 | Отправлено: 21:09 23-12-2010
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 9
    vu1tur (09-01-2011 11:53): лимит страниц, продолжение — http://forum.ru-board.com/topic.cgi?forum=62&topic=22143


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru