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

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

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

evle (19-03-2008 19:44): Лимит страниц.
Задачи на bat-файлах 5
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

vu1tur



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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 15:21 11-09-2007 | Исправлено: Elroir, 01:52 26-02-2008
    Serhi84

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Народ, здравствуйте.
     
    Задача, в процессе которой возникли проблемы с её решением  - есть папка, содержащая файлы и подпапки с файлами. Необходимо выявить файлы, дата модификации которых не больше определенной даты. В качестве параметров передавать:
    1) имя каталога с файлами, в котором нужно производить поиск
    2) признак поиска в подпапках(например 1 - просматривать файлы в подпапках, 0 - анализировать только  файлы в корне исходной папки, не учитывая подпапок)
    3) количество дней (не больше 31), которое вычитается из текущей даты. Полученная дата сравнивается с датой создания/модификации файлов в папке. Если существуют файлы старее  
    полученной даты - высылается уведомление на email.
    4). маска для поиска файлов (например *.txt - анализируем на старость только текстовые файлы).
     
       передать параметры при запуске программы не составит труда. Отправку на email сделал vbs-кой и буду вызывать её из bat`ника. Вычитание из текущей даты количества дней тоже в принципе представляю как делать (немножко изменить код в вышеперечисленных сообщениях где получали текущую дату -1 день).  
     
    НО!!!!!
     
    Когда получаю дату создания/модификации файла - результат выходит вместе со временем  
     
    For %%i In (c:\scr\*) Do SET create=%%~ti
    ECHO %create%  
     
    То есть мне нужно из возвращаемого значения как то выделить только дату, чтобы я мог сравнить это значение с другой датой. Вот в этом и загвоздка. Без времени данную строку не получить, функций для возврата части строки тоже нет. Не представляю как это сделать.  
     
    И еще вопрос - как сравнить 2 даты? Что-то типа  
    IF  "30.01.2009" > "30.01.2008"
    не срабатывает.
     
    Хотел писать все на vbscript, но не знаю как там внутри скрипта описать параметры для запуска....
     
    Вообще можно ли такую задачу реализовать с помощью vbscript или bat-файла ? либо придется искать что-то другое....
     
    Добавлено:
    Такс...с первой частью разобрался. Сначала вывожу дату/время модификации файлов в текстовый файл , а потом считываю его построчно  
     
    CD c:\scr\
      for /F "tokens=1* delims= " %%i in (dates.txt) do @echo %%i  
     
    Остается маленький вопрос - как сравнить 2 даты?  
     
    И еще - можно ли результат выполнения команды For %%i In (c:\scr\*) Do ECHO %%~ti писать не в текстовый файл и из него считывать, а сразу передавать данные на вход команды for /F "tokens=1* delims= " %%i in (??? что тогда будет здесь ???) do @echo %%i

    Всего записей: 45 | Зарегистр. 31-01-2008 | Отправлено: 14:58 31-01-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Serhi84
    А можно и не выводить в текстовый файл, посмотри ( а лучше скачай) все страницы этого топика, примеры были
    как сравнить 2 даты тоже не так уж и давно что то такое я выкладывал.
    For %%i In (c:\scr\*) Do (
         for /F "tokens=1* delims= " %%j in ("%%~ti") do @echo %%j
    )

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 16:36 31-01-2008
    Mamontoza



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Может я немпножко не потеме есть БАТНИК который при звершения процесса пишет лог в батнике импользуеться psexec, как сделать так чтоб в логе не выводилась инфа PSEXECa ???
    PsExec v1.82 - Execute processes remotely
    Copyright (C) 2001-2007 Mark Russinovich
    Sysinternals - www.sysinternals.com
     
    Процесс не найден: program.exe
    Connecting to User-01...
                                                                                   
     
    Starting PsExec service on User-01...
                                                                                   
     
    Connecting with PsExec service on User-01...
                                                                                   
     
    Starting tskill on User-01...
                                                                                 

    Всего записей: 67 | Зарегистр. 19-10-2006 | Отправлено: 11:03 01-02-2008 | Исправлено: Mamontoza, 13:03 01-02-2008
    Grim_Repo



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте, требуется батник который добавляет .reg файлы в реестр, у меня получился такой:
    Код:
    regedit /s abc.reg
    regedit /s def.reg
    regedit /s ghi.reg
    я правильно все сделал?
     
    А так же требуется батник который в случае если, например, процессы process.exe и process2.exe завершаются, записывал в лог дату (DD/MM/YYYY) и время (HH:MM:SS) их завершения, и выключал компьютер (успешное выключение компьютера тоже нужно записывать в лог), а так же требуется вариант который отключал интернет (успешное отключение интернета тоже нужно записывать в лог).
     
     
    Заранее, огромное спасибо!

    Всего записей: 397 | Зарегистр. 02-05-2006 | Отправлено: 13:11 01-02-2008 | Исправлено: Grim_Repo, 13:45 01-02-2008
    LDAP



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

    Код:
     
    for %%a in ("E:\Irbis\IRBIS\DATAI\DNEPR\*.cnt") do (
    xcopy "%%a" C:\DBase\WebIRBIS3.3\DNEPR\ /Y /R /H
    if ERRORLEVEL 1 (
    Комманда копирования файла "%%a" вернула код ошибки!!! >> log.txt
        ) else (
            Echo Файл "%%a" скопирован успешно >>log.txt
        )
        set proverka=yes  
    )
    if not defined proverka Echo Скрипт копирования вернул код ошибки "Файлы для копирования не найдены" >> log.txt  
    set proverka=
    rem
    rem
    rem
    for %%a in ("E:\Irbis\IRBIS\DATAI\INLIT\*.cnt") do (
    xcopy "%%b" C:\DBase\WebIRBIS3.3\INLIT\ /Y /R /H
    if ERRORLEVEL 1 (
    Комманда копирования файла "%%a" вернула код ошибки!!! >> log.txt
        ) else (
            Echo Файл "%%a" скопирован успешно >>log.txt
        )
        set proverka=yes  
    )
    if not defined proverka Echo Скрипт копирования вернул код ошибки "Файлы для копирования не найдены" >> log.txt  
    set proverka=
     

    Я не знаю как в батниках с переменными. Т.е. они устанавливаются как глобальные или же после выхода из цикла она(%%а) обнуляется/удаляется? Т.е. вопрос в следующем: по умолчанию, я так понял, после выхода из цикла переменная %%а будет удалена, значит в следующем цикле можно задать ее заново, и будет все ОК. Правильно я понимаю? Если да, то еще вопрос, а можно ли сделать переменную глобальной, т.е. чтобы она сохранила свое значение после выхода из for?
     
    Добавлено:
    king_stiven
    Да, скрипт работает. Спасибо.

    Всего записей: 522 | Зарегистр. 03-08-2005 | Отправлено: 14:35 01-02-2008
    01MDM



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

    Цитата:
    чтобы она сохранила свое значение после выхода из for

    Создай новую переменную set NewVar=%%a
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 15:10 01-02-2008
    cluster

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребята, а subinacl'ом можно снять галку "Наследовать разрешения от родительских объектов"?

    Всего записей: 1720 | Зарегистр. 21-11-2003 | Отправлено: 19:47 01-02-2008
    LDAP



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    И опять вопросы. Блин то ли я тупой, то ли пока не читал хорошего описания по батникам.
    Переменные:
    1.Как правильно отображаются переменные в батниках? Т.е. я в описаниях и в примерах видел много разных способов отображения переменной. В описании написано только то, что если скрипт будет запущен с консоли, то переменную вызывать как %а%, если скрипт будет запущен из батника, то переменную вызывать так:%%а%%. Правильно ли это?
    2.В примерах много раз встречал вызов так %%а. При каких условиях нужно так ее вызывать?
    3.Если имя переменной состоит не с одного символа, как ее вызывать? Т.е. если она объявлена так set var=1, то как ее вызывать?
    Подстановки:
    Допустим мне нужно скопировать файл, но при этом в конечном файле, после имени, перед расширением должна стоять единица.

    Код:
     
    for %%i in (cnt ifp l01 l02 n01 n02 mst xrf) do (
         for %%x in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
             set a=1
             set y=%%~Nx
             set z=%%~Xx
             set Newfname=%y%%a%%z%
             xcopy "%%x" C:\test\WebIRBIS3.3\irbis\ibis1\%Newfname% /Y /R /H
             if ERRORLEVEL 1 (
                 Комманда копирования файла "%%x" вернула код ошибки!!! >> log.txt
             ) else (
                 Echo Файл  "%%x" скопирован успешно >>log.txt
                 ren
             )
             set proverka=yes
         )
    if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
    set proverka=
    )
     

    Как здесь переменные обозначить, вроде все варианты перепробовал - не получилось. Или я вообще не правильно написал?

    Всего записей: 522 | Зарегистр. 03-08-2005 | Отправлено: 12:39 02-02-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LDAP
    1 В описании написано только то, что если скрипт будет запущен с консоли, то переменную вызывать как %а, если скрипт будет запущен из батника, то переменную вызывать так:%%а
     
    3 set var=1 , так мы задаём глобальную переменную var
    echo %var%, вызов переменной var
     

    Код:
    for %%c in (cnt ifp l01 l02 n01 n02 mst xrf) do (
        for %%d in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%c") do (
            xcopy "%%d" "C:\test\WebIRBIS3.3\irbis\ibis1\" /Y /R /H
            if ERRORLEVEL 1 (
                Комманда копирования файла "%%d" вернула код ошибки!!! >> log.txt
            ) else (
                Echo Файл  "%%d" скопирован успешно >>log.txt
            )
            ren "C:\test\WebIRBIS3.3\irbis\ibis1\%%~nxd" "%%~nd1%%~xd"
            set proverka=yes
        )
        if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
    set proverka=
    )

     
    запускай пробный батник вот так и анализируй каждую строчку, многие вопросы отпадут:
     
    for %%c in (cnt ifp l01 l02 n01 n02 mst xrf) do (
    pause
        for %%d in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
    pause
            xcopy "%%d" "C:\test\WebIRBIS3.3\irbis\ibis1\%%~nD1%%~xD" /Y /R /H
    pause
           ...

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 12:58 02-02-2008 | Исправлено: king_stiven, 19:20 02-02-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LDAP
    У тебя не получается, потому что ты применяешь переменные в одном цикле несколько раз, не включив расширение переменной среды. Вот так будет правильней.  Исправил не проверяя, могу где-то и ошибаться.  

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    for %%i in (cnt ifp l01 l02 n01 n02 mst xrf) do (
         for %%x in ("E:\TEMP_RA\IRBIS\DATAI\IBIS\*.%%i") do (
             set Newfname=%%~nx1%%~xx
             xcopy "%%x" "C:\test\WebIRBIS3.3\irbis\ibis1\!Newfname!" /Y /R /H
             if ERRORLEVEL 1 (
                 echo Комманда копирования файла "%%x" вернула код ошибки!!! >> log.txt
             ) else (
                 Echo Файл  "%%x" скопирован успешно >>log.txt
                 ren
             )
             set proverka=yes
         )
    if not defined proverka Echo Программа вернула код ошибки: "Файлы для копирования не найдены" >> log.txt
    set proverka=
    )
     

    Но можно и без setlocal enabledelayedexpansion

    Код:
     
    ...
    xcopy "%%x" "C:\test\WebIRBIS3.3\irbis\ibis1\%%~nx1%%~xx" /Y /R /H
    ...
     
     

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 15:47 02-02-2008 | Исправлено: 01MDM, 16:21 02-02-2008
    LDAP



    Full Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    king_stiven
    При вашей доработке в конечной папке он не перейменовует файлы. Т.е. не добавляет в название единицу.
     
    01MDM
    Скрипт работает так как нужно, кроме того, что он, перед каждым копированием спрашивает:
    C:\test\WebIRBIS3.3\irbis\ibis1\!Newfname! это имя файла или папки?
    Но вот я не пойму чего он спрашивает, ведь если есть расширение, то понятно что это имя файла?
    А послендий вариант я пробовал, у меня он не работал. Скрипт спрашивает это файл или папка(всего раз спрашивает), а потом в конечной папке создает один файл с названием %~nX%~xX и все. Тут, видимо дело в подстановке переменной, синтаксис не тот, и CMD не понимает что ему дают переменную для подстановки, думает что это просто имя. Потому я и спрашивал за правильно написание переменных в разных случаях.

    Всего записей: 522 | Зарегистр. 03-08-2005 | Отправлено: 17:24 02-02-2008 | Исправлено: LDAP, 17:34 02-02-2008
    01MDM



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

    Цитата:
    Тут, видимо дело в подстановке переменной

    Нет, это фича xcopy
    Из справочника:

    Цитата:
     
    /i  
    Если источником является каталог или источник содержит подстановочные знаки и результат не существует, команда xcopy считает, что результат — это имя каталога, и создает новый каталог. Затем xcopy копирует все указанные файлы в новый каталог. По умолчанию команда xcopy запрашивает подтверждение, является ли параметр результат каталогом или файлом.  
     

    А почему xcopy? В твоем случае copy - лучше не придумаешь.  

    Код:
     
    @echo off
    md test-1 2>nul
    for %%i in (test\*) do copy "%%i" "test-1\%%~ni-1%%~xi"
     

     
    Можно так, если хочешь с xcopy

    Код:
     
    ....
    echo f | xcopy "%%i" "test-1\%%~ni-1%%~xi" 1>nul 2>&1
    ....
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 18:55 02-02-2008 | Исправлено: 01MDM, 19:16 02-02-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LDAP
    Поправил
    01MDM
    Я ему предлагал copy , наверно принципы не позволяют.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 19:17 02-02-2008
    VladimirSavitsky

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите.
    Есть Bat файл:
     
    regedit.exe -s ProgReg.reg
    Prog.exe  
    regedit.exe -s ProgUnReg.reg
     
    Хотелось бы спрятать черное окно при обработке командного файла.
    Заранее спасибо.

    Всего записей: 40 | Зарегистр. 14-04-2006 | Отправлено: 13:42 03-02-2008
    NikTychina



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, пжл, как можно посмотреть время работы системы (XP Prof sp2)?

    Всего записей: 16 | Зарегистр. 14-10-2007 | Отправлено: 14:11 03-02-2008
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NikTychina
    systeminfo | findstr "Время работы"
     
     
    Добавлено:
    VladimirSavitsky
    Много раз обсуждалось, можно воспользоваться утилитами из "шапки" топика.

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 14:28 03-02-2008
    Elroir



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

    Цитата:
    успешное выключение компьютера тоже нужно записывать в лог

    Как ты себе это представляешь? Батник на выключенном компьютере записывает что-то в лог?

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 19:51 03-02-2008
    Grim_Repo



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

    Цитата:
    Как ты себе это представляешь? Батник на выключенном компьютере записывает что-то в лог?

    Я имел в виду записывть в лог успешное исполнение команды shutdown /s t 0

    Всего записей: 397 | Зарегистр. 02-05-2006 | Отправлено: 01:19 04-02-2008 | Исправлено: Grim_Repo, 01:31 04-02-2008
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Grim_Repo
    Все равно не понимаю - при исполнении этой команды, начнется процесс выключения системы, то есть остановка всех процессов, закрытие всех программ и окон. Успешное завершение команды shutdown - полное выключение компа. И как в таком случае записывать лог?

    ----------
    "В интернете есть все, но не всегда"

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 01:56 04-02-2008
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
     
    shutdown /s t 0
    if errorlevel 1 здесь записать неудачу выключения в лог и вывести её на экран
    автор может сам написать, я думаю.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 11:03 04-02-2008
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 4
    evle (19-03-2008 19:44): Лимит страниц.
    Задачи на bat-файлах 5


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru