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

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

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

KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows
 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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

   

hErAx

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

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

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

  • Отправлено: 01:53 25-10-2015 | Исправлено: Paromshick, 21:51 18-12-2017
    ZuB007



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Имеется консольная программка, с 'бесконечным' временем выполнения операций и флагами запуска.
    Периодически, раз в 10-20 сек она посылает в консоль определённы данные. Но, программка весьма своенравна, и может попросту само-зациклится, не подавая в консоль сообщений, при этом ОС не говорит об проблемах с отсутствием отклика.
     
    Как можно организовать запуск сей программки, с её закрытием по таймауту (допустим 60сек) на ответ.
    Желательно, без создания доп.окон и/или скрытого процесса, т.к. её запуск происходит в теле батника, и её закрытие влияет на ход.
     
    Так-же, килл по имени процесса через консоль недопустим, т.к. параллельно запущены несколько её копий.

    Всего записей: 105 | Зарегистр. 23-06-2007 | Отправлено: 19:07 01-10-2016 | Исправлено: ZuB007, 21:22 01-10-2016
    nik4z



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    ZuB007
    Непростая задачка для батника, но решить можно.

    Код:
    @echo off
    ::Запускаемый процесс
    set exec=1.exe
    ::Время ожидания отклика 20 sec.
    set waittime=20
     
    :_3
    set windowtitle=[%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%]
    if exist "%temp%\%windowtitle%.$$$" goto _3
     
    set logsize=0
    start "%windowtitle%" /min cmd.exe /c ">""%temp%\%windowtitle%.$$$"" ""%exec%"""
     
    :_0
    set i=%waittime%  
    :_1
    cls
    echo Start %exec%
    echo windowtitle  %windowtitle%
    echo logsize=%logsize%
    echo wait %i%
    ping -n 2 localhost > nul  
    for /f "usebackq delims=" %%a in ('"%temp%\%windowtitle%.$$$"') do set logsize1=%%~za
    if %logsize%x==%logsize1%x goto _4
    set logsize=%logsize1%
    goto _0
    :_4
    set /a i-=1
    if not %i%==0 goto _1
     
    :_2
    taskkill /fi "windowtitle  eq %windowtitle%"
    del /q "%temp%\%windowtitle%.$$$"

     

    Всего записей: 218 | Зарегистр. 08-11-2015 | Отправлено: 03:20 02-10-2016 | Исправлено: nik4z, 16:28 02-10-2016
    ZuB007



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо. Возникли трудности.
    С перенаправлением в файл, работает исключительно 2>
    Но тогда на экране пустота ;(
     
    Есть ли способ заменить windowtitle
    на "start /B" и закрытие через "PID" с проверкой запущенности.
     
     
     

    Всего записей: 105 | Зарегистр. 23-06-2007 | Отправлено: 16:51 02-10-2016 | Исправлено: ZuB007, 17:03 02-10-2016
    nik4z



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

    Цитата:
    Есть ли способ заменить windowtitle
    на "start /B" и закрытие через "PID" с проверкой запущенности.

     
    Можно и через "PID" .
     

    Код:
    @echo off
    ::Запускаемый процесс
    set exec=1.exe
    ::Время ожидания отклика 20 sec.
    set waittime=20
     
    setlocal enabledelayedexpansion  
     
    :_3
    set log=[%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%%RANDOM%].log
    if exist "%temp%\%log%" goto _3
     
    set logsize=0
     
    call :Run "%exec%"
    :: if "%Pid%"=="" .... Процесс не запустился
    :_0
    set i=%waittime%  
    :_1
    cls
    echo Start %exec%
    echo.Pid=%Pid%
    echo logsize=%logsize%
    echo wait %i%
    ping -n 2 localhost > nul  
    for /f "usebackq delims=" %%a in ('"%temp%\%log%"') do set logsize1=%%~za
    if %logsize%==%logsize1% goto _4
    set logsize=%logsize1%
    goto _0
    :_4
    set /a i-=1
    if not %i%==0 goto _1
     
    :_2
    taskkill /f /fi "pid eq %Pid%"
    :_5
    >nul 2>&1 del /q "%temp%\%log%"
    if exist "%temp%\%log%" goto _5
    goto :EOF
     
    :Run
    set "Pids="
    for /f "skip=3 tokens=2" %%i in ('tasklist /fi "imagename eq %~nx1"') do (
      set "Pids=!Pids!,%%i"
    )
    set "Pids=!Pids!,"
    set "Pid="
    >"%temp%\%log%" 2>&1 start "" /d "%~dp1" /b "%~f1"
    for /f "skip=3 tokens=2" %%i in ('tasklist /fi "imagename eq %~nx1"') do (
      if "%Pids%"=="!Pids:,%%i,=!" set "Pid=%%i"
    )
    goto :EOF

     

    Всего записей: 218 | Зарегистр. 08-11-2015 | Отправлено: 20:06 02-10-2016 | Исправлено: nik4z, 02:16 03-10-2016
    ZuB007



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Эм... хз как так вышло ...

    Цитата:
    ZuB007  
    Поправил пост.  

    ---
    Ну в общем, кое-какие мелочи под себя и скрипт конфетка! Без лишних окон.  
    Спасибо!!
     
     - в :Run вместо "%1" пришлось вписывать вручную, иначе не заводилось.
     - на :_2 флаг /f перед /fi еще будет полезен для лучшего закрытия.

    Всего записей: 105 | Зарегистр. 23-06-2007 | Отправлено: 01:16 03-10-2016 | Исправлено: ZuB007, 01:24 03-10-2016
    nik4z



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

    Цитата:
     - в :Run вместо "%1" пришлось вписывать вручную, иначе не заводилось.
     - на :_2 флаг /f перед /fi еще будет полезен для лучшего закрытия.

    Поправил скрипт.

    Всего записей: 218 | Зарегистр. 08-11-2015 | Отправлено: 02:11 03-10-2016
    ZuB007



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    если вместо  /d "%~dp1" /b "%~f1"  
    /b %exec%
     
    полёт нормальный.

    Всего записей: 105 | Зарегистр. 23-06-2007 | Отправлено: 03:53 03-10-2016 | Исправлено: ZuB007, 03:54 03-10-2016
    jFobos



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Помогите пожалуйста.
    Написал батник, который перебирает все файлы в папке in и передает их как параметр программе xcode, она эти файли кодирует и сохраняет результат в папку out.
     

    Код:
    @echo off
    del /Q out\*
    for /r %%I in ("in\*.z") do xcode %%I > out\%%~nxI
    for /r %%I in ("in\*.q") do xcode %%I > out\%%~nxI
    pause

     
    Все работает как надо, результат выводится на экран:
     

    Код:
    xcode E:\xcode\in\file1.z ->
    xcode E:\xcode\in\file______2.z ->
    Nemohu otevrit soubor E:\XRC\in\file______2.z
    xcode E:\xcode\in\file3.q ->
    Для продолжения нажмите любую клавишу . . .

     
    Вопрос: как этот вывод продублировать в файл? Типа лога работы.
     
    И еще вопрос. Как пройтись по всех файлах в папке автозаменой и заменить символ перевода каретки /r/r на /r. Просто иногда возникает ошибка и символ /r дублируется.

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 13:11 03-10-2016 | Исправлено: jFobos, 13:32 03-10-2016
    YuS_two



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

    Цитата:
    как этот вывод продублировать в файл?

    В шапке полезные утилиты, в частности mtee.

    Цитата:
    Как пройтись по всех файлах в папке автозаменой и заменить символ перевода каретки /r/r на /r.

    Это задача не для cmd, по крайней мере в "чистом" виде. Воспользуйтесь, например, sed-ом или даже AkelPad (у него тоже есть возможность работать через комстроку) или ещё чем-либо более подходящим...

    Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 14:24 03-10-2016 | Исправлено: YuS_two, 14:25 03-10-2016
    jFobos



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Спасибо. С mtee все понятно и просто. А как быть с sed?
    Вот такой код выводит в консоль корректную замену по всем файлам:
    for %%I in ("out\*.*") do sed "s/\r//" %%I
     
    А вот такой код создает пустые файлы:
    for %%I in ("out\*.*") do sed "s/\r//" %%I > %%I
     
    В чем прикол? Оо
     

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 16:28 03-10-2016
    YuS_two



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

    Цитата:
    В чем прикол?


    Код:
    for %%i in ("out\*.*") do >$ sed -r "s/(\r)\1/\1/g" "%%~i"&>nul move /y $ "%%~i"

    Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 00:05 04-10-2016
    jFobos



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

    Всего записей: 452 | Зарегистр. 03-12-2007 | Отправлено: 09:58 04-10-2016
    Victor33Man



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jFobos
    Не понял, почему нужны внешние программы?
    Хоть я и слабоват в скриптах...но вот так примерно можно:

    Код:
     
    @echo off
    SETLOCAL ENABLEDELAYEDEXPANSION
    del /Q out\* >NUL
    for /r  %%I in ("in\*.z") do (
    del /q NewFile.txt 2>NUL
    echo %%I
    for /f "delims=" %%M in (!%%I!) do (
    set ST=%%M
    set ST=!ST:/r/r=/r!
    echo !ST! >>NewFile.txt
    )
    copy /y NewFile.txt out\%%~nxI >NUL
    rem xcode NewFile.txt > out\%%~nxI
    )
    del /q NewFile.txt >NUL
    Pause

    Даже проверил - на copy  
    На xcode не могу, т.к. нету у меня ее...
     

    Всего записей: 273 | Зарегистр. 06-04-2016 | Отправлено: 12:48 04-10-2016 | Исправлено: Victor33Man, 12:52 04-10-2016
    YuS_two



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

    Цитата:
    /r

    Это не два символа, которые требуется заменить, а просто ошибочная запись Esc-последовательности, т.е. перевода каретки "\r"...

    Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 14:37 04-10-2016
    chatt

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Есть файл из двух колонок md5-хеш и имя файла (краткое, с расширением, UTF-8).
    Есть каталог с множеством файлов во всевозможных подкаталогах.
     
    Нужен батник, который просчитает md5 всех файлов и, в случае совпадения хеша с табличным значением, даст этому файлу табличное имя. Вне зависимости от расположения файла, т.е. он останется в том же подкаталоге.
     
    Добавлено:
    И, если можно, загляните в тему http://forum.ru-board.com/topic.cgi?forum=8&topic=37814#20 там другая задачка, дублировать тут не хочется.

    Всего записей: 186 | Зарегистр. 28-05-2016 | Отправлено: 13:07 11-10-2016 | Исправлено: chatt, 13:10 11-10-2016
    Elroir



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    chatt
    В шапке темы есть ссылка на Майкрософтовскую утилиту fciv, которая умеет работать с md5.
    На всякий случай, вот прямая ссылка: http://download.microsoft.com/download/c/f/4/cf454ae0-a4bb-4123-8333-a1b6737712f7/Windows-KB841290-x86-ENU.exe
    Следующий код использует как раз ее (fciv.exe должен лежать в той же директории, что и командный файл или в одной из директорий, прописанных в переменной PATH):
     

    Код:
     
    @echo off
    setlocal
    set "folder=D:\Downloads"
    set "checksumFile=checksums.txt"
    fciv %folder%\ /r > "filesList.txt"
    for /f "tokens=1*" %%a in (%checksumFile%) do (
        for /f "skip=2 tokens=1*" %%A in ('find "%%a" filesList.txt') do (
            if not "%%B"=="" ren "%%B" "%%b"
        )
    )
    del filesList.txt
     

     
    Замени выделенные значения на свои:
    folder - директория с файлами, которые надо проверить и переименовать
    checksumFile - файл с md5 и новыми именами файлов


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

    Всего записей: 2631 | Зарегистр. 05-02-2003 | Отправлено: 22:17 11-10-2016 | Исправлено: Elroir, 23:55 11-10-2016
    AntoshAReal



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

    Код:
     
    >proxy_prostovpn.org.pac findstr /R /V /C:"^    if (isIE) {" /C:"^      return ""PROXY gw2.anticenz.org:8080; DIRECT"";"" /C:"^    } else {" /C:"^      return ""HTTPS gw2.anticenz.org:443; PROXY gw2.anticenz.org:8080; DIRECT"";"" /C:"^    }" /C:"^  }" /C:"^  return ""DIRECT"";" /C:"^}" proxy.pac  
    >>proxy_prostovpn.org.pac echo.
    >>proxy_prostovpn.org.pac echo.    if (isIE) {
    >>proxy_prostovpn.org.pac echo.      return "proxy.antizapret.prostovpn.org:3128; DIRECT";
    >>proxy_prostovpn.org.pac echo.    } else {
    >>proxy_prostovpn.org.pac echo.      return "HTTPS proxy.antizapret.prostovpn.org:3143; PROXY proxy.antizapret.prostovpn.org:3128; DIRECT";
    >>proxy_prostovpn.org.pac echo.    }
    >>proxy_prostovpn.org.pac echo.  }
    >>proxy_prostovpn.org.pac echo.
    >>proxy_prostovpn.org.pac echo.  if (dnsDomainIs(host, ".onion")) {
    >>proxy_prostovpn.org.pac echo.    return "PROXY 127.0.0.1:1080"; // tor proxy
    >>proxy_prostovpn.org.pac echo.  }
    >>proxy_prostovpn.org.pac echo.  if (dnsDomainIs(host, ".i2p")) {
    >>proxy_prostovpn.org.pac echo.    return "PROXY 127.0.0.1:1080"; // i2p proxy
    >>proxy_prostovpn.org.pac echo.  }
    >>proxy_prostovpn.org.pac echo.
    >>proxy_prostovpn.org.pac echo.  return "DIRECT";
    >>proxy_prostovpn.org.pac echo.}  
     

    Но получилась фигня, скорее всего экранировал неправильно.
    Думаю, если возможно, искать    if (isIE) { и удалять всё что ниже, потом дописывать недостающее.

    Всего записей: 305 | Зарегистр. 31-08-2005 | Отправлено: 20:09 12-10-2016 | Исправлено: AntoshAReal, 20:09 12-10-2016
    AngelNet



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    доброе время суток!
    подскажите, если из батника вызываю другую гуёвую программу, консоль остаётся висеть на заднем плане пока не отработает вызванный софт или её не закроет юзер.
    как то можно закрыть окно самостоятельно?
     
    например вызываю очистку диска окон:
    Код:
    C:\Windows\System32\cleanmgr.exe

    и хочу сразу же закрыть консольное окно, это возможно?

    ----------
    animelist

    Всего записей: 7412 | Зарегистр. 11-03-2004 | Отправлено: 22:54 12-10-2016
    hErAux



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

    Код:
    start C:\Windows\System32\cleanmgr.exe

    Всего записей: 210 | Зарегистр. 08-04-2016 | Отправлено: 23:18 12-10-2016
    YuS_two



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

    Код:
    start "" "c:\ программа с пробелами в пути.exe"

    чтобы в дальнейшем не возникало вопроса "почему оно не работает?"

    Всего записей: 399 | Зарегистр. 28-03-2016 | Отправлено: 23:57 12-10-2016
       

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

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 12
    KLASS (06-03-2018 00:44): Объединение тем по сценариям: Сценарии Windows


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru