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

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



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

    Цитата:
    yurkesha
    Ну вообще в вышеуказанном коде в список попадут не только файлы но и имена каталогов вложенных в исходную папку(1 уровень вложения). Чтобы этого не произошло надо добавить ключ /a:-d. Да и непонятно зачем надо использовать промежуточный файл - проще сразу все реализовать:
    Без просмотра файлов из подвложенных папок
    Код:
    FOR /F "USEBACKQ TOKENS=1 EOL= DELIMS=" %%i IN (`dir scripts /b /a:-d`) DO ECHO "%%i"
     
    С просмотром файлов из подвложенных папок
    Код:
    FOR /F "USEBACKQ TOKENS=1 EOL= DELIMS=" %%i IN (`dir scripts /b /a:-d /s`) DO ECHO "%%i"
     
    Где "%%i" - полное имя файла с путем и обрамляющими кавычками. И вместо ECHO используешь нужную тебе команду...

    Спасибо!
    Получилось, но есть еще одна папка, с которой нужно сделать тоже самое.
    Проблема в том что папка содержит множество подпапок и файлов.
    Как скопировать все эти подпапки и файлы точно в такой же структуре в другую папку ?
    Пока что у меня получается только все скопом

    Всего записей: 302 | Зарегистр. 03-04-2008 | Отправлено: 21:35 23-06-2009
    HaK1R



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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set /a t=0
    for /f "tokens=1,2" %%a in (tmp.txt) do (
      if "%%b."=="528." (set /a t-=%%a & set /a min=%%a)
      if "%%b."=="551." (set /a t+=%%a)
      if "%%b."=="6008." (set /a t+=%%a)
    )
    set /a min=%time:~0,2%*60+%time:~3,2%-%min%
    chcp 1251 1>nul
    echo Общее время работы %t% минут
    echo Время в последнем сеансе %min% минут
    chcp 866 1>nul

     
     
    p.s. А где этот файл в системе лежит и как он называется(я не про tmp.txt, а про оригинал)?

    Всего записей: 136 | Зарегистр. 04-05-2009 | Отправлено: 21:48 23-06-2009
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nuke142
    ну тут еще проще - xcopy тебе в помощь... Безо всяких for...

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 22:02 23-06-2009
    gbcfkf



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    День добрый..
    как бы при выводе результата ping в текстовый файл добавить точное время пинга? например переменную %time%
    что-то вроде:
     
    c:\>ping 10.40.0.1 -t
    Обмен пакетами с 10.0.0.1 по 32 байт:
    Ответ от 10.0.0.1: число байт=32 время<1мс TTL=255  11:57:49.79  
    Ответ от 10.0.0.1: число байт=32 время<1мс TTL=255  11:57:50.13
    ...

    Всего записей: 702 | Зарегистр. 17-10-2006 | Отправлено: 04:59 24-06-2009 | Исправлено: gbcfkf, 05:00 24-06-2009
    01MDM



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    gbcfkf
    Нет, так сделать нельзя. У ping'а такой фичи нет, а все данные он "отдает" только когда закончит процесс. Только после этого их можно обработать (тем же for).

    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 06:29 24-06-2009
    smirnvlad

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

    Код:
     
    @echo off
    setlocal enabledelayedexpansion
    set /a t=0
    for /f "tokens=1,2" %%a in (tmp.txt) do (
      if "%%b."=="528." (set /a t-=%%a & set /a min=%%a & set event=logon)
      if "%%b."=="551." (set /a t+=%%a & set event=logoff)
      if "%%b."=="6008." (set /a t+=%%a & set event=logoff)
    )
    if %event%==logon set /a t+=%min%
    if %event%==logon set /a min=%time:~0,2%*60+%time:~3,2%-%min%
    if %event%==logon set /a t+=%min%
    if %event%==logoff set min=0
     
    chcp 1251 1>nul
    echo Общее время работы %t% минут
    echo В том числе Время в текущем сеансе %min% минут
    chcp 866 1>nul
     
     

    Всего записей: 417 | Зарегистр. 31-03-2009 | Отправлено: 07:56 24-06-2009
    gbcfkf



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM
    блин...  
    придется огород городить:

    Код:
     
    @echo off
    :cycle
    @ping 10.0.0.1 -n 1 >> log.txt  
    echo %time% >> log.txt  
    @ping 172.31.255.254 -n 1 -w 50
    goto cycle  
     

    а потом вырезать нужные строки..

    Всего записей: 702 | Зарегистр. 17-10-2006 | Отправлено: 09:02 24-06-2009
    HaK1R



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    smirnvlad
    Что-то мне подсказывает, что в этом нет необходимости, поскольку г-н slay1212 заменил истинное название системного файла на tmp.txt, а при запуске этого кода на машине, будет использоваться истинный сис файл, а раз машина запущена, то последней строкой будет вход в систему, а не выход
     
    Добавлено:
    smirnvlad
    я тут тоже немного исправлю, надеюсь вы не против

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set /a t=0
    for /f "tokens=1,2" %%a in (tmp.txt) do (
      if "%%b."=="528." (set /a t-=%%a & set /a min=%%a & set "event=logon")
      if "%%b."=="551." (set /a t+=%%a & set "event=logoff")
      if "%%b."=="6008." (set /a t+=%%a & set "event=logoff")
      )
    if "%event%==logon" (
      set /a t+=%min%
      set /a min=%time:~0,2%*60+%time:~3,2%-%min%
      set /a t+=%min%
      )
    if "%event%==logoff" set min=0
     
    chcp 1251 1>nul
    echo Общее время работы %t% минут
    echo В том числе время в текущем сеансе %min% минут
    chcp 866 1>nul

    Всего записей: 136 | Зарегистр. 04-05-2009 | Отправлено: 09:45 24-06-2009 | Исправлено: HaK1R, 09:54 24-06-2009
    slay1212

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HaK1R
    smirnvlad
     Спасибо работает! но вариант HaK1R показывает t отрицательное ( как я понимаю, из-за того что самый поздний логон отнимается последним в t .
      Да tmp.txt это не системный файл,  а полученная выборка по заданному юзеру из файлов security(528 и 551) и system(6008)отсортированное по времени. Если интересно выложу код получения. Вообше я писал изначальную задачу пару страниц назад но никто тогда не откликнулся
      Хотелось бы еще проверки на ошибки - теоретически может глюкануть и бсод вообще не запишется в системный журнал - те может идти несколько логонов логофов подряд - в этом случае получается отрицательное число.
    В этом случае надо наверное брать только полседний по времени logon logoff
     Я чо то в ифах запутался   . Вот примет данных  
     Подробнее...
    А вот что получилось на 10:03  
    Общее время работы -123 минут  
    В том числе Время в текущем сеансе 63 минут  

    Всего записей: 336 | Зарегистр. 28-05-2008 | Отправлено: 10:05 24-06-2009
    king_stiven

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

    Код:
    FOR /F "TOKENS=*" %%i IN ('dir scripts /b') DO (
        if exist "%%i\" (
            xcopy "%%i" "куда\%%i" /I /E /H
        ) else (
            xcopy "%%i" "куда"
        )
    )

    команда xcopy не любит слэшей в конце пути папок.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 11:09 24-06-2009 | Исправлено: king_stiven, 11:45 24-06-2009
    ZeroCrash



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Мне нужно во многих батниках заменить один и тот же участок кода (который во всех батниках одинаковый и находится в одном и том же месте) на другой. Можно ли автоматизировать такой процесс?

    Всего записей: 43 | Зарегистр. 15-04-2009 | Отправлено: 11:23 24-06-2009
    HaK1R



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

    Цитата:
    Спасибо работает! но вариант HaK1R показывает t отрицательное ( как я понимаю, из-за того что самый поздний логон отнимается последним в t .  


    Код:
    @echo off
    setlocal enabledelayedexpansion
    set /a t=0
    for /f "tokens=1,2" %%a in (tmp.txt) do (
      if "%%b."=="528." (set /a t-=%%a & set /a min=%%a)
      if "%%b."=="551." (set /a t+=%%a)
      if "%%b."=="6008." (set /a t+=%%a)
    )
    set /a min=%time:~0,2%*60+%time:~3,2%-%min%
    set /a t+=%time:~0,2%*60+%time:~3,2%
    chcp 1251 1>nul
    echo Общее время работы %t% минут
    echo Время в последнем сеансе %min% минут
    chcp 866 1>nul  

     
    Добавлено:
    slay1212
    я правильно понимаю, что если подряд идут несколько logon то берем первый, а если logoff то последний?
     
    Добавлено:

    Цитата:
    Если интересно выложу код получения.

    Интересно

    Всего записей: 136 | Зарегистр. 04-05-2009 | Отправлено: 13:07 24-06-2009
    slay1212

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

    Цитата:
    я правильно понимаю, что если подряд идут несколько logon то берем первый, а если logoff то последний

     Я бы хотел последний логон, логофы внеочередные вряд ли появятся. Ну а идеологически правильно было бы анализировать еще и 6005 6006 из system (это время старта и стопа компа ( не юзера). Но тогда вообще каша получается Ниже код получения tmp.txt
    Подробнее...
     Ну а дальше ваш код, уважаемые коллеги, далее сравнить с разрешенным временем работы,если превышено - логофф либо шатдоун через 5 минут с надписью " парень пора выключать комп хорош играть " . Это для 2003, в ХР я посмотрел для домена  по умолчанию аудит логона логоффа отключен, те 551 и 528 в секурити не пишутся , для домашнего надо проверить, будет ли работать  

    Всего записей: 336 | Зарегистр. 28-05-2008 | Отправлено: 14:55 24-06-2009 | Исправлено: slay1212, 14:59 24-06-2009
    HaK1R



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

    Цитата:
    Ну а дальше ваш код, уважаемые коллеги, далее сравнить с разрешенным временем работы,если превышено - логофф либо шатдоун через 5 минут с надписью " парень пора выключать комп хорош играть "  

    Зачем все так сложно?! Трудно остановить себя?
     
    Добавлено:
    slay1212

    Цитата:
    Ну а идеологически правильно было бы анализировать еще и 6005 6006 из system (это время старта и стопа компа ( не юзера).

    а мы повторятся не будем? ведь если камп включается и logon то в журнале будет  
    6005
    528
    тогда при подсчете два раза вычтем, может и в минус уйдем
    вообщем нужно в из блакнота взять данные, посчитать общее время за день и последнего сеанса. От 528 или 6005, До 551 или 6006 или 6008.
    Причем Если подряд идут 528 и 6005, то берем тот, который позднее, а логоффы подряд не идут. И если время текущего сеанса больше чего-то, то выключение через 5 минут с предупреждением. ТАК?

    Всего записей: 136 | Зарегистр. 04-05-2009 | Отправлено: 16:15 24-06-2009
    slay1212

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

    Цитата:
    Причем Если подряд идут 528 и 6005, то берем тот, который позднее, а логоффы подряд не идут. И если время текущего сеанса больше чего-то, то выключение через 5 минут с предупреждением. ТАК?

      Да так главное время определить правильно

    Всего записей: 336 | Зарегистр. 28-05-2008 | Отправлено: 16:50 24-06-2009
    elektrizer

    Newbie
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Можно как-нибудь реализовать запуск файла спустя определенное время после запуска батника?

    Всего записей: 13 | Зарегистр. 27-05-2009 | Отправлено: 21:12 24-06-2009
    alexander6161



    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    elektrizer
    Можешь поставить паузу в батнике, после неё он запустит программу и закроется.

    Код:
    ping -n число 127.0.0.1>nul
    start "" "программа.exe"
    exit
    где число - пауза в секундах+1. Если нужна пауза 60 секунд, ставишь туда 61.
     
    Можешь использовать сторонние утилиты для создания паузы, если такой метод не устраивает.
    Про паузы можешь почитать здесь:
    http://forum.ru-board.com/topic.cgi?forum=62&topic=11825&start=1300#6

    Всего записей: 185 | Зарегистр. 17-08-2008 | Отправлено: 21:32 24-06-2009 | Исправлено: alexander6161, 00:55 25-06-2009
    HaK1R



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    slay1212
    выключает если время текущего сеанса больше заданного(в минутах)

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set /a limit=300
    set /a t=0
    for /f "tokens=1,2" %%a in (tmp.txt) do (
      if "%%b."=="528." (set /a min=%%a)
      if "%%b."=="6005." (set /a min=%%a)
    )
    set /a min=%time:~0,2%*60+%time:~3,2%-%min%
    if %min% GTR %limit% (shutdown -s -t 300 -c "парень пора выключать комп хорош играть (с)")

    Всего записей: 136 | Зарегистр. 04-05-2009 | Отправлено: 12:42 25-06-2009
    slay1212

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    HaK1R
     Спасибо, но я тебе неправильно сказал условия - нужно именно суммарное время за день с учетом того что может быть несколько 528 кодов. Интересует именно принцип поиска времени для каждого отрезка когда юзер работал.  Имхо нужно отслеживать появления пары событий логон юзера - логоф (или шатдаун), из нескольких подряд логонов брать последний по времени.  

    Всего записей: 336 | Зарегистр. 28-05-2008 | Отправлено: 15:43 25-06-2009
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Nuke142
    по поводу копирования - код представленный king_stiven неоптимален... Я ведь писал - никаких FOR не надо...
    Код:
    xcopy /е scripts\* "куда"
    и этого достаточно.

    ----------
    Всем непричастным рекомендую прогулки на свежем воздухе

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 15:56 25-06-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