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

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



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

    Цитата:
    вопрос: кто-нибудь знает, сколько будет по времени так крутится этот бесконечный цикл (время как-то регламентировано в настройках cmd или нет)
    бесконечно, пока этот cmd не закроют извне.
     
    и такой цикл очень нехило жрет процессор, так что полезно влепить в цикл какую-то паузу, например так:
    Код:
    :type1
    type 83572.txt
    if ErrorLevel 1 ping -n 2 localhost >nul && goto type1

     
    Добавлено:
    при желании время сам считай - заняться в цикле все равно нечем

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 17:13 15-10-2009
    7ead3471

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Проблема решена.
    нужно было убрать пробел в конце строк:
    echo %LOGIN%>>FTP.txt
    итд.
     

    Всего записей: 2 | Зарегистр. 15-10-2009 | Отправлено: 17:53 15-10-2009
    mugil_cephalus

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

    Цитата:
    внимательно читаем if /?  
    ERRORLEVEL number  
    Specifies a true condition if the last program run returned an exit code equal to or greater than the number specified.

     
    да я с этим не спорю, просто я никак не могу понять твои тезисы соотнесенно моему коду - if NOT ErrorLevel 0 (goto type1) - , где есть конструкция NOT
     
    F:\Documents and Settings\admin>if /?
    Оператор условного выполнения команд в пакетном файле.
     
      NOT               Обращает истинность условия: истинное условие
                        становится ложным, а ложное - истинным.
     
    Добавлено:
    wolf0425

    Цитата:
    и такой цикл очень нехило жрет процессор,

    у меня жрал ~50% - менее, чем какая-либо игра, вирт. память - вообще не росла (катал цикл минут 5)
     
     
    Добавлено:
    wolf0425

    Цитата:
    и такой цикл очень нехило жрет процессор, так что полезно влепить в цикл какую-то паузу, например так:
    Код::type1  
    type 83572.txt  
    if ErrorLevel 1 ping -n 2 localhost >nul && goto type1  

     
    см. в шапке - Делаем паузу в командном файле стандартными средствами Windows http://forum.ru-board.com/topic.cgi?forum=62&topic=11825&start=1300#6  

    Цитата:
    Чаще всего для этих целей предлагают команду ping. Лично мне совершенно не нравится этот способ. Задержка, даваемая командой ping очень неточна. Более того, она очень зависит от настроек сети. У меня был случай, когда из-за файрвола пауза получалась какая угодно, но только не та, что была задана в команде.

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 18:37 15-10-2009
    wolf0425



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

    Цитата:
    Чаще всего для этих целей предлагают команду ping. Лично мне совершенно не нравится этот способ. Задержка, даваемая командой ping очень неточна.
    так нам точность задержки как раз совершенно не критична, а вот то что ping.exe в 10 раз короче cscript.exe - дает небольшую разницу в пиковой нагрузке на процессор/память/файловую систему и не требует попутного мусора в батнике.
     
    Ну и вот я сейчас сравнил варианты ping и sleep.js
    десять вызовов 1-секундных пингов плюс 1 echo %time% заняли 10.71сек.
    десять вызовов 1000-милисекундных sleep.js и echo %time% заняли 12.5 сек.
    повторил - 10.53 и 11.64
    Это к вопросу о их сравнительной точности
     

    Цитата:
    просто я никак не могу понять твои тезисы соотнесенно моему коду - if NOT ErrorLevel 0 (goto type1) - , где есть конструкция NOT  
    NOT инвертирует состояние false/true, выдаваемое ErrorLevel 0
    сам ErrorLevel 0 - одинаково выдает true для любого кода ошибки, который может вернуть  команда type, так как он у нее никогда не меньше нуля.
    А ты почему-то три раза пытался убедить, что при возврате ошибки 1 что-то в этом if должно отличаться от случая возврата признака успеха 0, на основании того что 1 != 0.
    в конструкции ErrorLevel N сравнивается не на равенство, if /? я выше процитировал.
     
    Задуманный микрософтом вариант перехода по любому неуспеху type - это if errorlevel 1 goto
     

    Цитата:
    у меня жрал ~50% - менее, чем какая-либо игра
    на двухядерном, наверно?
    или просто гипертрейдинг так помогает? Или кто-то еще пытался на 100% загрузить проц?
     
    на старых процах такой цикл без задержки и конкурентов - жрет 100% совершенно не напрягаясь, да еще и файловые опрерации подтормаживая. проверено многократно.
    с добавленным пингом - 0%, как ожиданию и положено. а что появившийся файл заметит в среднем на полсекунды позже - так наверно же пофиг?

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 01:31 16-10-2009 | Исправлено: wolf0425, 04:01 16-10-2009
    ponand

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    А можно чем нибудь батник свернуть к часам ?

    Всего записей: 56 | Зарегистр. 14-07-2008 | Отправлено: 09:34 16-10-2009
    Ninja33



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте! Ребята, помогите решить такую задачу: На диске С: есть папка DIR1, в ней лежит около ста папок с разными названиями, например 1,2,3...100. В папках 1,2,3...100 находятся разные файлы, но в каждой из них, есть один текстовый файл с именем Log.txt. Также на диске С: есть папка DIR2 в ней папки с именами, аналогично как в DIR1, т.е.1,2,3...100,но пустые... Нужно из каждого подкаталога в С:\DIR1 скопировать Log.txt, в соответсвующую папку в  С:\DIR2....То есть из С:\DIR1\1 скопировать файл Log.txt, в С:\DIR2\1, из С:\DIR1\2 скопировать Log.txt в С:\DIR2\2 и т.д. Зарание спасибо!

    Всего записей: 32 | Зарегистр. 28-09-2008 | Отправлено: 10:42 16-10-2009
    01MDM



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

    Код:
     
    @echo off
    pushd "c:\dir1"
    for /d %%i in (*) do copy "%%i\log.txt"  "c:\dir2\%%i\log.txt"
    popd
     


    Всего записей: 2638 | Зарегистр. 13-02-2006 | Отправлено: 11:27 16-10-2009
    Ninja33



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    01MDM ,спасибо большое, все работает...!






    Спасибы — в ПМ!

    Всего записей: 32 | Зарегистр. 28-09-2008 | Отправлено: 12:21 16-10-2009 | Исправлено: vu1tur, 12:25 16-10-2009
    bpof



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите скрпит наисать.
     
    Есть фтп. у каждой учётной записи своя  папка  (C:\ftp\%username%)  
    задача: удолять файлв в папках пользователей старше 7 дней, не удоляя самих папок пользователей.  
     
    если исользовать команду del, то надо для каждой папки нового пользователя дописывать batник. это не айс.
     
    хочется чтоб удалялись все файлы и папки дальше 3его уровня.

    Всего записей: 20 | Зарегистр. 14-02-2005 | Отправлено: 14:35 16-10-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bpof
    В шапке много интересного.

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 14:41 16-10-2009
    bpof



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    king_stiven
    ткните пальцем, не найду никак.  

    Всего записей: 20 | Зарегистр. 14-02-2005 | Отправлено: 14:58 16-10-2009
    noiseless

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bpof
    См. внимательней сюда

    Всего записей: 182 | Зарегистр. 06-02-2006 | Отправлено: 15:16 16-10-2009
    bpof



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    noiseless
    смотрел. ничего для себя не увидел.
    в задаче неизвестно имя 3его уровня. как это в bat ввести?
     
    надо просто удолить все папки 3его уровня, команда del /f /s /q C:\del\*\*.* это не может. что использовать вместо C:\del\*\ ??

    Всего записей: 20 | Зарегистр. 14-02-2005 | Отправлено: 15:37 16-10-2009 | Исправлено: bpof, 15:43 16-10-2009
    noiseless

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bpof
    Вот, например,  как получить список всех поддиректорий в папке "ftp":
    for /f "tokens=*" %%i in ('dir C:\ftp /a:d /B') do echo %%i

    Всего записей: 182 | Зарегистр. 06-02-2006 | Отправлено: 16:38 16-10-2009
    mugil_cephalus

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

    Цитата:
    NOT инвертирует состояние false/true, выдаваемое ErrorLevel 0  
    сам ErrorLevel 0 - одинаково выдает true для любого кода ошибки, который может вернуть  команда type, так как он у нее никогда не меньше нуля.  
    А ты почему-то три раза пытался убедить, что при возврате ошибки 1 что-то в этом if должно отличаться от случая возврата признака успеха 0, на основании того что 1 != 0.  
    в конструкции ErrorLevel N сравнивается не на равенство, if /? я выше процитировал.

     
    тогда получается такой дискурс: errorlevel 0 при %errorlevel%=1 будет true, а NOT должен инвертировать на false, а if false не выполнит goto :type1 в конструкции if not errorlevel 0 goto type1 (как это было бы при if true: if true выполняет goto :type1)

    Цитата:
    на двухядерном, наверно?  
    или просто гипертрейдинг так помогает? Или кто-то еще пытался на 100% загрузить проц?  
     
    на старых процах такой цикл без задержки и конкурентов - жрет 100% совершенно не напрягаясь, да еще и файловые опрерации подтормаживая. проверено многократно.  
    с добавленным пингом - 0%, как ожиданию и положено. а что появившийся файл заметит в среднем на полсекунды позже - так наверно же пофиг?

    2,6 ггц 1 ядро гипертрейдинг
    для wait'a/sleep'a я не хочу использовать VBS (это оффтоп, ИМХО) и ping (как не рекомендовали в шапке) Кстати, у меня wait ping'om - все окей (фаервол однин раз спросил - я разрешил ping)

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 16:44 16-10-2009 | Исправлено: mugil_cephalus, 20:31 16-10-2009
    wolf0425



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

    Цитата:
    тогда получается такой дискурс: errorlevel 0 при %errorlevel%=1 будет true
    да

    Цитата:
    а NOT должен инвертировать на false
    да

    Цитата:
    а if false не выполнит goto :type1 в конструкции if not errorlevel 0 goto type1
    да. и это является ответом на первоначальный вопрос  

    Цитата:
    никак не могу понять, где ошибка:  
    после if not ErrorLevel 0 (goto type1) он сразу перескакивает на pause, а не возвращается на метку :type1  

     
    для секундной паузы где-то в шапке была sleep.exe - но ее же таскать надо, пинг в этом смысле удобнее - он везде есть. Кстати боюсь что про 50% загрузки - это тебя процессор обманывает: запусти батник без пинга параллельно с просмотром видео, что-ли.

    Всего записей: 2928 | Зарегистр. 25-04-2007 | Отправлено: 18:46 16-10-2009 | Исправлено: wolf0425, 18:47 16-10-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    wolf0425
    из идеологических соображений (не хочу использовать VBS (это оффтоп, ИМХО) и ping -n localhost (как не рекомендовали в шапке)) - "только "язык" батников и ничего кроме" , написал себе sleep-батник с иной конструкцией - schtasks - он еще "сырой", я не закончил его тестировать, и вижу много возможностей для оптимизации кода профи с форума, но я дальнейшую оптимизацию - читай сокращение скрипта - не осилю...
     
    @echo off
    cls
     
    :morpheus
    set dirPathMorpheus1=%temp%
    set jobMorpheus1=morpheus1J.job
    set waitModifierMorpheus1=1
    set outputMorpheus1=nul
    echo schtasks /delete /tn %jobMorpheus1:~0,-4% /f > %dirPathMorpheus1%\morpheus1T.bat 2>&1
    echo I have woken up! > %dirPathMorpheus1%\typeme2.txt 2>&1
    echo ren %dirPathMorpheus1%\typeme2.txt typeme1.txt >> %dirPathMorpheus1%\morpheus1T.bat 2>&1
     
    :if_exist_%jobMorpheus1%
    if exist %systemroot%\tasks\%jobMorpheus1% (goto exist_%jobMorpheus1%)
    schtasks /create /ru *** /rp *** /sc minute /mo %waitModifierMorpheus1% /tn %jobMorpheus1:~0,-4% /tr %dirPathMorpheus1%\morpheus1T.bat
    goto typeme
    :exist_%jobMorpheus1%
    schtasks /delete /tn %jobMorpheus1:~0,-4% /f
    goto if_exist_%jobMorpheus1%
     
    :typeme
    @echo off
    echo Please wait...
    rem Countdown: The result has not been counted up yet.
    rem setlocal enabledelayedexpansion
    rem for /f "tokens=* usebackq" %%A (`schtasks /query`) do (if /i %jobMorpheus1:~0,-4% eql %%A (set endTimeMorpheus1=%%B))
    rem echo Countdown: !countdownMorpheus1!
    type %dirPathMorpheus1%\typeme1.txt > %outputMorpheus1% 2>&1
    if %ErrorLevel% neq 0 goto typeme
     
    cd /d %dirPathMorpheus1%
    del /q morpheus1T.bat typeme1.txt
    set dirPathMorpheus1=
    set jobMorpheus1=
    set waitModifierMorpheus1=
    set outputMorpheus1=
    echo Morpheus has finished.
     
    pause
     
    P.S.
    да countdown еще не расчитал...
     
    Добавлено:
    wolf0425

    Цитата:
    для секундной паузы где-то в шапке была sleep.exe - но ее же таскать надо, пинг в этом смысле удобнее - он везде есть. Кстати боюсь что про 50% загрузки - это тебя процессор обманывает: запусти батник без пинга параллельно с просмотром видео, что-ли.

    батник без ping'a дает: ~50%, где 30%-40% у cmd.exe и ~10% у какого-то csrss.exe  
    далее: + запуск *.mp4 -> без изменений (wmplayer.exe еще - ~3%-5%)
    всего процессов: ~55  
     
     
    wolf0425
     
    я сейчас понял (если не ошибся) , как в подпрограмме :typeme избежать ~50% загрузкии CPU:
    в подпрограмме :typeme нужно запустить notepad или калькулятор (или что-то подобное - явно не нужное/не запущенное - (или winmine.exe, mshearts.exe, %SystemRoot%\system32\timedate.cpl)) без комманды start, чтобы cmd (выполнение батника) "зависло"/ожидало закрытия notepad'a или калькулятора, а в подпрограмме :morpheus вбить код echo taskkill notepad/calc.exe > %dirPathMorpheus1%\morpheus1T.bat 2>&1
     
    добавление: еще лучше в в подпрограмме :typeme  запуск без команды start *.vbs-файла с примерно таким кодом wscript.echo Please wait %waitModifierMorpheus1% minute(s)....

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 19:01 16-10-2009 | Исправлено: mugil_cephalus, 18:24 18-10-2009
    king_stiven

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    bpof
    CD /D C:\1
    for /d %%e in (*) do (
        PushD "%%e"
        if not errorlevel 1 RD /s /q .
        PopD
    )

    Всего записей: 2229 | Зарегистр. 17-07-2006 | Отправлено: 07:44 17-10-2009
    mugil_cephalus

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    по поводу вызова из батника кодов/ф-ций из *.DLL наткнулся на такую вещь (правда, не *.bat, а VBS) -  http://www.robvanderwoude.com/files/getrundl_vbs.txt (это же -  http://www.robvanderwoude.com/wmiexamples.php файл GetRunDL.vbs) вот description GetRunDL.vbs: List all RUNDLL(32) commands for file associations from the registry
    пока разбираюсь, но, ИМХО, - небольшой паллиатив

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 19:10 17-10-2009 | Исправлено: mugil_cephalus, 19:14 17-10-2009
    Aleksei_N



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите написать скрипт.
    Есть список URL (одна строка - один адрес), нужно что бы скрипт перешел по первому адресу, если в ответ пришла картинка (gif), то не чего не делать, а если пришел ответ "Not found" то адрес записывается в файл txt, затем берется следующий адрес и т.д. При этом http:// должно подставляться автоматически

    Всего записей: 123 | Зарегистр. 27-05-2009 | Отправлено: 11:22 18-10-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