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

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

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

    Цитата:
    Как это можно сделать, не создавая временный файл и не используя сам HTML файл  

    Задача из серии "Компьютер позволяет легко решать проблемы, которые до его изобретения вообще не существовали"
    Я такие вещи на vbscript и пишу, зачем себе голову забивать то и отнимать свое собственное время. Есть конечно батники, в которых использую конструкции вроде:
     
    REM Меняем > на ^>
    SET LINE=!LINE:^>=^^^>!
    REM Меняем < на ^<
    SET LINE=!LINE:^<=^^^<!
    REM Меняем ^& на ^^^&
    SET LINE=!LINE:^^^&=^^^^^&!
    ... и т.д., пока все возможные бяки не перечислишь, но этож неудобно...

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 16:02 15-04-2007
    InSe0F



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ой, тут столкнулся с такой проблемкой
    в общем серву( ну тот что я запускал в скрипте) иногда посылают через инет запрос выключения, ну он конечно же выключатся, но вот через некоторое время включается снова
    думали 2 варианта решения этой проблемы:
    1) запуск через удалёнку и там же  его даун, но в система не очень корректно работает в этом случае, бывает глючит в общем
    2) есть напрямую доступ с фтп именно к папке с сервом, с полным доступом, но программы и батники если и запускаются то работают некорректно
    может можно как нить скопировать в папку со скриптом текстовой файл с определённой переменной или какой нить меткой чтобы бат её прочитал и задаунил серв в случае если это надо сделать или запустил серв если он не запущен и оперделённая метка есть

    Всего записей: 532 | Зарегистр. 13-03-2006 | Отправлено: 18:28 15-04-2007
    igor_andreev

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

    Цитата:
     иногда посылают через инет запрос выключения, ну он конечно же выключатся, но вот через некоторое время включается снова
    Может в настройках проги стоит для начала поковыряться-разобраться, с чего он сам включается то? В теме про Serv-U спросить, может там знают...

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

    Это флаг-файл называется, их и читать не надо, обычный пустой текстовой файл с любым именем-расширением.  
    "Изготавливается" типа echo.>start.flg или echo.>down.flg и закидывается на ftp.
    И в батнике if exist start.flg делаешь что надо, флаг-файл удаляешь.

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 20:05 15-04-2007
    Smitis



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

    Цитата:
    Тогда маленький вопросик, как правильно и красиво передать передать VBS скрипту значение значение переменной, содержащей "плохие" символы  - ."<> b и т.д. не использую временный файл?  

    Так прямо в vbs и используй эту переменную

    Код:
     
    Dim WshShell, WshEnv
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set WshEnv = WshShell.Environment("PROCESS")
    WScript.Echo WshEnv("TestVar")
     

    Или через ExpandEnvironmentStrings
     
    Добавлено:
    Вот народ не любит гибридные файла, а люблю.
    И в очередной раз у некоторых возникает проблема паузы из батника стандартными средствами. Вот мой пример cmd_with_sleep.cmd:

    Код:
     
    @set @x=0 /*
    @echo off
     
    echo PAUSE BEGIN
    :: Сдесь делаем паузу 3 секунды
    cscript //nologo /e:jscript "%~f0" 3000
    echo PAUSE END
     
    :: Конец CMD-части
    exit /b
    */
    // JS-часть
    WScript.Sleep(WScript.Arguments(0))
     



    ----------
    Разум когда-нибудь победит

    Всего записей: 2430 | Зарегистр. 09-02-2003 | Отправлено: 23:52 15-04-2007
    InSe0F



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    1)в общем не могу разобраться чтот, где-то ошибка не могу найти.
    не работает последнее условие, if exist ON.st ( ... ), т.е. я вижу что это файл существует и процесс убит, но заного не запускается , фиг знает чо за дело.
    если убираешь первое условие всё нормально срабатывает, но тогдаже и срабатывает если сервер остановлен.
    нашёл пока выход тем что заменил первый ИФ на такой if exist OFF.st (goto _1) т.е. флаг ОФФ у меня когда серв точно должен быть в дауне и не подниматься. но всёже хочеться понять в чём здесь глюк.
     
    2)а и ещё вопрос как коменты писать? а то rem отображает их, а мне они в логе нафиг не нужны...
     
    Подробнее...
     
    Добавлено:

    Цитата:
     
    Может в настройках проги стоит для начала поковыряться-разобраться, с чего он сам включается то? В теме про Serv-U спросить, может там знают...  

    нее ты немного не понял, не ФТП поднимается а Сервак кс, в общем погляди скрипт.

    Всего записей: 532 | Зарегистр. 13-03-2006 | Отправлено: 01:37 16-04-2007 | Исправлено: InSe0F, 01:39 16-04-2007
    Tipulatoid



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

    Цитата:
    2)а и ещё вопрос как коменты писать? а то rem отображает их, а мне они в логе нафиг не нужны...

    Поставь

    Код:
    @echo off

    в начало батника

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 03:14 16-04-2007
    Maza Faka



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

    Код:
     
    @Echo off
    rem Start /HIGH C:\games\cs_server\cs\spider.exe Для чего нужны эти строки не понял поэтому закоментил
    rem echo.> C:\games\cs_server\#script_start\ON.st
     
    :_1
    sleep 600
    if exist start.flg (
    Start /HIGH C:\games\cs_server\cs\spider.exe
    echo.> C:\games\cs_server\#script_start\ON.st
    del /f /q C:\games\cs_server\#script_start\OFF.st
    del /f /q start.flg)
     
    if exist stop.flg (
    taskkill /f /im spider.exe
    echo.> C:\games\cs_server\#script_start\OFF.st
    del /f /q C:\games\cs_server\#script_start\ON.st
    del /f /q stop.flg)
     
    if exist C:\games\cs_server\#script_start\ON.st (
    tasklist | find /i "spider.exe" || Start /HIGH C:\games\cs_server\cs\spider.exe)
    goto _1
     

    У меня работает, как создаю файл "stop.flg" игра убивается, тестил на Виндовой игре "Пасьянс паук"

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

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

    Цитата:
    нее ты немного не понял, не ФТП поднимается а Сервак кс

    Ну да недопонял, тыж написал
    Цитата:
    в общем серву( ну тот что я запускал в скрипте)
    я и подумал на Serv-U. Сервак кс - мне кстати тоже ни о чем не сказало, не всеж в Counter Strike играют
    По сабжу - зачем тебе такое неимоверное количество флаг-файлов? Я кстати неправильно подсказал, в плане "флаг-файл удаляешь", в смысл батника не сразу вьехал, извиняюсь. Из батника в твоем случае его удалять не надо. У тебя нормальная задача в батнике проверять процесс и если не запущен - запускать? Вот и пусть этим занимается по умолчанию. А тебе, когда надо остановить процесс - закидываешь stop.flg и все. Когда понадобиться запустить - просто удаляешь сам этот stop.flg. Будет приблизительно так:

    Код:

    :_1  
    sleep 3
    if exist stop.flg (
     tasklist | find /i "notepad.exe" && taskkill /f /im notepad.exe  
    ) else (
     tasklist | find /i "notepad.exe" || start notepad
    )
    goto _1

    Это я проверил на блокноте с интервалом в 3 сек Если создать stop.flg - блокнот прибивается и не запускается, пока этот stop.flg существует. Убрать stop.flg - блокнот запускается.
     
    Там тебе кстати на предыдущей странице Maza Faka линк дал на sleep.exe - имхо правильнее им пользоваться, ресурсов меньше жрет. Эти задержки с пингом или скриптами хороши только как временная мера. Если постоянно в батниках используешь паузу - лучше sleep.exe закинуть в PATH.

    Всего записей: 1667 | Зарегистр. 08-12-2004 | Отправлено: 13:20 16-04-2007 | Исправлено: igor_andreev, 13:39 16-04-2007
    InSe0F



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maza Faka
    спасиб за последний ИФ, хотя твой скрипт не удобен тем что в нём надо будет менять очень много путей, если надо будет поменять папки, лучше юзать переменные
     
    igor_andreev
    да сделал со слипом.
    хотя в мой вариантик был наверно нагляднее, чел залезает в папку и видет 2 флага, включен серв или выключен, надо ему включить копирует туда старт, иначе стоп и всё.
    хотя большой разницы  я не вижу, разве только у тебя короче получилось, по скорости обработки скорее всего одинаково, хотя ИФ довольно "много" жрёт, так что хз.
     
    в общем всем пасиба) всё вроде доделал
     
    Добавлено:
    ан нет, есть ещё вопрос, вообщем можно ли как нить определить сколько процентов процесс?
    просто у меня иногда как то странно q3 серв подвисает, не могу пока понять причину, может из-за КС сервака... мож ещё из-за чего...
    так вот когда он виснет он не умирает, но начинает жрать жутко проц, ну гдето процентов на 20-30, если я рядом то сразу вижу по мониторингу и перезапускаю, но иногда я редко за ней бываю, в общем тут уже всё понятно только как определить что она столько жрёт фиг знает, в этом собственно и вопрос.

    Всего записей: 532 | Зарегистр. 13-03-2006 | Отправлено: 18:49 16-04-2007
    Maza Faka



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    InSe0F
    Не нашёл, где в тасклисте посмотреть сколько ресурсов проца жрёт процесс, но можно убивать зависшие приложения по статусу "Не отвечает"
    Примерно так:

    Код:
     
    @Echo off
    For /F "Tokens=1-8" %%a in ('Tasklist /v ^| Find /i "cs.exe"') do (
    If /i "%%g"=="Работает" (Goto End) Else (Taskkil /f /im cs.exe)
    )
    :End
     

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



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Elroir
    Спасибо... Остаётся только улыбаться...

    Всего записей: 4182 | Зарегистр. 03-05-2006 | Отправлено: 04:43 17-04-2007
    Maza Faka



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

    Цитата:
    так вот когда он виснет он не умирает, но начинает жрать жутко проц, ну гдето процентов на 20-30, если я рядом то сразу вижу по мониторингу и перезапускаю, но иногда я редко за ней бываю, в общем тут уже всё понятно только как определить что она столько жрёт фиг знает, в этом собственно и вопрос.

     
    Выше я выкладывал батник, но этот получше будет! убивает зависший процесс "cs.exe"

    Код:
     
    @Echo off
    Chcp 1251
    For /F "Tokens=1*" %%a in ('Tasklist /v ^| Find /i "cs.exe" ^| Find /i "Работает"') do If %errorlevel%==0 (Goto :EOF) Else (Taskkil /f /im cs.exe)
     

     
     
    Добавлено:
    Наткнулся в сети на интересный код:

    Код:
     
    @Echo off
    Call :Factorial %1
    Echo %Result%>1.txt
    Exit
     
    :Factorial
    If "%1"=="0" (
    Set Result=1
    exit /b
    )
     
    If "%1"=="1" (
    Set Result=1
    exit /b
    )
     
    Set /a Param=%1-1
     
    Call :Factorial %Param%
    Set /a Result=%1 * %Result%
    Exit /b
     

    Кто нибудь может разжевать, что именно происходит, когда я запускаю этот батник с аргументом "5", то в ввывод записывается число "120", почему?

    Всего записей: 1420 | Зарегистр. 25-10-2006 | Отправлено: 08:02 17-04-2007 | Исправлено: Maza Faka, 11:38 17-04-2007
    Gabzya



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    неподскажите как заменить укр буквы в именах файлов\папок "ї" и "і" на др символы, или вовсе их удалить?
    есть много папок с файлами, кот нужно заархивировать зипом, он их не понимает
    заранее спс

    Всего записей: 1149 | Зарегистр. 14-12-2004 | Отправлено: 12:16 17-04-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gabzya
    Задача интересная. Подскажи, буквы "ї" и "і" по звучанию на какие русские буквы больше всего похожи?
    И неплохо бы привести пример полных названий папок и файлов, кот. нужно изменить.

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 12:37 17-04-2007
    vu1tur



    Moderator-Saaber
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Gabzya
    Если это нужно сделать один раз, то проще сделать замену с помощью того же Total Commandera (Ctrl+M).
     
    Maza Faka
    Берётся факториал, значения от 1 до %1 хранятся в локальных переменных (параметрах процедуры Factorial).

    ----------
    I am free of all prejudice. I hate everyone equally.

    Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:53 17-04-2007
    Gabzya



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    і-и
    ї-йы
    vu1tur
    например название папки- "Діловодство україни за 2005 рік"
    файла - "Договір з фізиками.doc"
    как при помощи ТС ???

    Всего записей: 1149 | Зарегистр. 14-12-2004 | Отправлено: 13:32 17-04-2007
    Tipulatoid



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Gabzya
    Этот батник меняет буквы "ї" и "і" в именах всех файлов в текущей папке на "и" и "йы". Как менять названия папок, я чего-то не дошел. Внимание! Т.к. на моей раскладке нет украинской буквы "i", то в код я забил аналог из латинского алфавита. В коде это выделено жирным. Вам нужно будет данный символ исправить именно на украинский самостоятельно.

    Код:
    @echo off
    setlocal enabledelayedexpansion
     
    for /f "tokens=*" %%a in ('dir /b /a:-d') do (
       set name=%%a
       set name=!name:i=и!
       set name=!name:ї=йы!
       ren "%%a" "!name!"
    )

    Идея кода взята у igor_andreev - его батник по транслиту имен файлов из темы Командная строка, батники\сценарии

    Всего записей: 349 | Зарегистр. 22-12-2006 | Отправлено: 14:45 17-04-2007 | Исправлено: Tipulatoid, 14:49 17-04-2007
    Elroir



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

    Цитата:
    Кто нибудь может разжевать, что именно происходит, когда я запускаю этот батник с аргументом "5", то в ввывод записывается число "120", почему?

    Если разжевывать сильнее, чем это сделал vu1tur ():
    Чему у нас равен факториал 5-и? - 1*2*3*4*5=120. Передаем батнику число 5, он запускает процедуру :Factorial с аргументом 4, соответственно, то же самое происходит с числами 3 и 2. А вот когда мы дошли до числа 1 - батник не будет вызывать :Factorial, а сразу вернет ответ - 1. То есть после выхода из последнего вызова, переменная Result=1 и мы, наконец, добрались в первый раз до строчки Set /a Result=%1 * %Result%. %1=2, Result=1, значит новое значение Result=2*1=2. Возвращаемся к предыдущему вызову процедуры - %1=3, Result  у нас теперь равен 2, значит Result=3*2=6. Таким образом мы доберемся до самого первого запуска процедуры :Factorial, когда %1=5, а Result уже равен 24 (4*6). 5*24=120, все процедуры :Factorial завершились - получаем результат 120. Обычная рекурсия.
     
     
    Добавлено:
    Tipulatoid

    Цитата:
    Как менять названия папок, я чего-то не дошел

    Для переименовывания папок, используется команда move:
    move old_name new_name

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 14:49 17-04-2007
    slayer120



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
     Уважаемый All хочу решить такую задачу с использованием bat /cmd:
      Заполнение табеля - в виде текстового файла -
     число - время включения компа - время выключения компа.
     Я так понял надо анализировать журнал System (не знаю, можно ли в cmd)
    на предмет появления 1 го события с код 6005 - "Запущена служба журнала  
    событий" и последнего события с кодом 6006 "Служба журнала событий  
    остановлена" (первого и последнего - потому что могут быть перезагрузки).  
      В идеале хотелось бы это сделать по сетке с несколькими юзерами.
      Возможно такое (Для xp)?

    Всего записей: 303 | Зарегистр. 24-01-2007 | Отправлено: 15:17 17-04-2007
    Gabzya



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Tipulatoid
    спс большое, а можно для особых,
    Цитата:
     
     for /f "tokens=*" %%a in ('dir /b /a:-d') do (
       set name=%%a  

    это означает: на диске /f вo всех папках ?

    Всего записей: 1149 | Зарегистр. 14-12-2004 | Отправлено: 15:34 17-04-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.Board
    © Ru.Board 2000-2020

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru