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

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



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Добрый вечер!
    есть вопрос такого плана:
    Например Есть в наличии файл такого типа-    1.inualink.7z  .Файл находится в запакованном виде 7z.Весит в нераспакованном виде 819 мб,в распакованом 5,049,762,283 - наверное 5.05 ггб  Файл лежит в папке с таким названием 1.inualink
    Файл предварительно распаковывается мной
     
    Задача - посчитать с помощью батника вес файла в распакованном виде и вписать этот вес в таком формате в название папки :
    1.inualink - 5.05 ггб  
    Затем  посчитать с помощью батника вес файла в нераспакованном виде и вписать этот вес в название которое получилось ранее,т.е в это:  1.inualink - 5.05 ггб  
    чтобы получилось так:
    1.inualink - 5.05 ггб - (819 мб)
     
    Такое преобразование следует проделать с файлами 7z,rar,zip где будут уже другие данные для вписания в название папки
     
     
    Если такое возможно проделать с помощью батника буду рад вашей помощи или это может сделать какая-нибудь программа!
    И заранее благодарю!

    Всего записей: 113 | Зарегистр. 11-07-2015 | Отправлено: 22:21 08-11-2016 | Исправлено: Linksach, 22:37 08-11-2016
    BorlandIMHO

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Linksach
    Нафига там чего-то "считать"?

    Код:
    REM 7z.exe должен находиться в папке, прописанной в системной переменной PATH
    for /f "tokens=4,5" %%A in ('7z.exe l 1.inualink.7z^|find /i "1.inualink"') do (
    set /a COMPRESSEDSIZE=%%B
    set /a UNCOMPRESSEDSIZE=%%A
    )

    7-zip умеет работать в т.ч. с архивами rar (кроме модификации) и zip.  
    Размеры упакованного и неупакованного файла получены в соответствующие переменные, дальше используйте как угодно. Единственно что - размеры в байтах, но уж в мега- и гига- байты перевести довольно просто...

    ----------
    http://www.imho.ws

    Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 23:55 08-11-2016 | Исправлено: BorlandIMHO, 19:35 09-11-2016
    NIKZZZZ



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

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

    На счет условия, помочь не могу, просто не понял задачи.
    По поводу пустых строк, разрешимо:

    Код:
    @echo off
    chcp 1251
    SETLOCAL EnableDelayedExpansion
     
    set SRC=file.txt
    set DST=out_#.txt
    set DLM=-----
     
    for /f "tokens=1,* delims=]" %%i In ('find  /v /n "" "%SRC%" ') do (
    if not defined $F (
      set /a $N+=1& set $F=F
      set "$O=%DST:#=!$N!%"
      type nul >"!$O!")  
    if not "%%j"=="%DLM%" echo %%j>>"!$O!"
    if "%%j"=="%DLM%" set $F=)  

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 00:23 09-11-2016 | Исправлено: NIKZZZZ, 20:28 09-11-2016
    Okapulka

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Спасибо, завтра попробую.
     
    Задача — порезать mbox-файл, содержащий кучу писем, на кучу отдельных писем.
    Первая строка каждого письма всегда начинается с "From  "

    Код:
    From  Thu Nov 26 11:39:35 2015

    Последняя строка каждого письма всегда начинается с "------------" и заканчивается на "--"

    Код:
    ------------9RcBvHqFgv0WPUYTf0Th5Y--

    После последней строки каждого письма идёт пустая строка, после неё и надо резать. В итоге должны получится файлы, в которых первая строка начинается с "From  ", а последняя строка пустая.
     
    Я, когда пробовала батник, специально добавляла метку "-----" между письмами, добавляла посредством поиска и замены в редакторе, так вот — достаточным условием поиска было "--" в конце строки (--\n), но в "set DLM", я так поняла, надо содержание целой строки вносить.
     
    Либо задать, чтобы резалось перед строкой начинающейся с "From  ".
     
    Ещё очень желательно, чтобы задавался для обработки не конкретный файл, а все с определённым расширением (*.mbs). А названия для выходных файлов брались у исходных + нумерация. Но без этого можно и обойтись.
     
    Объяснила, как смогла, надеюсь доходчиво получилось.

    Всего записей: 171 | Зарегистр. 14-05-2016 | Отправлено: 06:14 09-11-2016 | Исправлено: Okapulka, 06:23 09-11-2016
    Linksach



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

    Всего записей: 113 | Зарегистр. 11-07-2015 | Отправлено: 08:45 09-11-2016
    tramparamparam02



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Прошу прощения за, возможно, детский вопрос, но я очень мало имел дело в с батниками. Подскажите, как запустить из батника несколько команд с небольшой паузой между ними, но чтобы при этом следующая команда запускалась до окончания работы предыдущей команды. (Как я понимаю, общий принцип работы батников со времён DOS, что каждая последующая команда запускается только после завершения работы предыдущей.)
     
    То есть, нужно примерно так:
    1. Запускаем программу, ну, например, Format C: chkdsk.exe C:
    2. Ждём 1 секунду (программа chkdsk.exe всё ещё работает!)
    3. Запускаем программу notepad aaa.txt и пишем в него свои впечатления (а chkdsk.exe делает что-то своё, что ей положено)
    4. Сохраняем файл aaa.txt, закрываем notepad.exe (программа chkdsk.exe по-прежнему работает )
    5. Chkdsk.exe отработала и выводит на экран отчет.
     
    Вот как-то так хотелось бы. Имена программ, конечно, условные, но алгоритм такой же. Спасибо!

    Всего записей: 2371 | Зарегистр. 30-03-2016 | Отправлено: 09:56 09-11-2016 | Исправлено: tramparamparam02, 09:57 09-11-2016
    ne_viens

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    @start chkdsk.exe >nul
    @ping.exe -n 2 localhost >nul
    @notepad.exe aaa.txt >nul

    Всего записей: 1521 | Зарегистр. 01-11-2004 | Отправлено: 10:29 09-11-2016
    NIKZZZZ



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

    Код:
    @echo on
    set dirs=%~dp0
     
    cd /d "%dirs%"
    for /f "delims=" %%f in ('dir /b /a:-d *.mbs') do (
      set $n=0
      set DLM="------------*--"
      for /f "tokens=1,* delims=]" %%a In ('find  /v /n "" "%%f" ') do call :Split "%%b" "%%~nf"
    )
    goto :eof
     
    :Split
    if %DLM%=="------------*--" goto _1
    if "%~1"=="" (>>"%2_%$n%.txt" echo.) else (for /f "delims=" %%c in ("%~1") do (>>"%2_%$n%.txt" echo.%%c))  
    set xx="%~1"
    set DLM=%xx:~0,13%*%xx:~-3%
    set DLM="%DLM:"=%"
    goto :eof
     
    :_1
    set /a $n+=1
    2>"%2_%$n%.txt" set DLM=""
    cls
    echo Обработка письма %~2.mbs %$n%
    goto :eof
     
     

     
    Недостаток скрипта символ "^" будет удваиваться, а символ "%" будет пропадать, можно, конечно, и эту проблему решить, но это сильно усложнит скрипт и уменьшит скорость его работы.
     
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 16:14 09-11-2016 | Исправлено: NIKZZZZ, 19:56 09-11-2016
    Okapulka

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Первый батник создаёт файлы с пронумерованными пустыми строками. Начало первого файла имеет вид
    Код:
    ---------- FILE.TXT
    [1
    [2
    [3
    Начало второго
    Код:
    [506
    [507
    [508
    И так далее.
    Причём нумерация в именах выходных файлов начинается с двойки. Странно, это наверное когда две консоли открыто...
     
     
    Второй вариант сообщает: "Непредвиденное появление: >.". Создаётся один файл с содержимым первого письма до символа ">".
    Цитата:
    Недостаток скрипта символ "^" будет удваиваться, а символ "%" будет пропадать
    Это не страшно, проверила половину своих файлов, которые нужно обработать — такие символы не попались.
    добавлено
    Ан нет, во второй половине файлов символы "%" присутствуют в немалом количестве. И потеря их конечно же недопустима.
     
     

    Всего записей: 171 | Зарегистр. 14-05-2016 | Отправлено: 18:50 09-11-2016 | Исправлено: Okapulka, 20:15 09-11-2016
    NIKZZZZ



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

    Цитата:
    Второй вариант сообщает: "Непредвиденное появление: >.".  

    Поправил баг в предыдущем посте.

    Цитата:
    во второй половине файлов символы "%" присутствуют в немалом количестве.

    Посмотрю, что можно сделать, пока  можно в любом редакторе поправить исходник, заменив % на %% , все должно быть нормально.
     

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 20:27 09-11-2016
    BorlandIMHO

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Linksach
    Подправил. Там пробел в одном месте пропущен был...
    И комент про 7-zip добавил. Либо в каталоге, доступном по PATH, либо в текущем должна быть.
    В этом виде - работает.

    ----------
    http://www.imho.ws

    Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 22:37 09-11-2016
    NIKZZZZ



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

    Код:
    @echo off
    set dirs=%~dp0
     
    setlocal enabledelayedexpansion
     
    cd /d "%dirs%"
     
    for /f "delims=" %%f in ('dir /b /a:-d *.mbs') do call :Split "%%f"
    echo **** Задание выполнено ****
    >nul pause
    goto :eof
     
    :Split
      set $n=0
      set dlm="------------*--"
      for /f "tokens=1,* delims=]" %%a in ('find  /v /n "" "%~1" ') do (
        if not !dlm!=="------------*--" (
          for /f "delims=" %%x in ("%~n1_!$n!.txt") do (
            setlocal disabledelayedexpansion
            >>"%%x" echo.%%b  
            setlocal enabledelayedexpansion
          )
          set xx="%%b"
          set dlm=!xx:~0,13!*!xx:~-3!
          set dlm="!dlm:"=!"
          ) else (  
          set /a $n+=1
          2>"%~n1_!$n!.txt" set dlm=""
          cls
          echo Обработка письма %~nx1 [!$n!]
        )
      )
    goto :eof

     
    Всем хороши батники, но с текстом нормально работать нормально не умеют.

    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 22:40 09-11-2016 | Исправлено: NIKZZZZ, 23:53 09-11-2016
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    NIKZZZZ
    Цитата:
    Всем хороши батники
    Ну да уж прямо... хороши лишь чем-то немногим, одно лишь - проще.
    А вообще для работы с неизвестным содержимым (не бинарным, но все же) - прямая дорога хотя бы в VBS/JS

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 22:55 09-11-2016
    Unnicked

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Пожалуйста, подскажите, как проще всего решить bat-файлом следующую задачу:
     
    Нужно проверить текстовый файл на наличие определенного слова в тексте (например, слова Error), и если слово есть то выполнить определенную команду (например, скопировать этот файл в заданный каталог).

    Всего записей: 1119 | Зарегистр. 19-08-2005 | Отправлено: 23:15 09-11-2016
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Unnicked
    Крайне обобщенная задача, нужны примеры и очень серьезные уточнения

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 23:22 09-11-2016
    BorlandIMHO

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Unnicked
    Где-то так:
    Код:
    find /i "Error"<"yourfile.txt" && copy "yourfile.txt" "x:\new path to\yourfile.txt" || echo No word "Error" in "yourfile.txt"


    ----------
    http://www.imho.ws

    Всего записей: 2376 | Зарегистр. 12-10-2006 | Отправлено: 23:23 09-11-2016 | Исправлено: BorlandIMHO, 23:27 09-11-2016
    NIKZZZZ



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

    Код:
    find "Error" "file.txt" && copy "file.txt" ....


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 23:25 09-11-2016
    Unnicked

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ, BorlandIMHO
    Спасибо, так действительно очень просто!
     
    До этого использовал вот такой код:

    Код:
    @echo off
     
    set "str=Error"
    set "inFile=file.txt"
    set "outFile=file_err.txt"
    set "foundErr="
     
    for /f "delims=" %%i in ('type "%infile%"^| find/i "%str%"') do set foundErr=%%i
    if defined foundErr (copy %inFile% %outFile%) else (echo No errors)

    Всего записей: 1119 | Зарегистр. 19-08-2005 | Отправлено: 23:42 09-11-2016 | Исправлено: Unnicked, 23:43 09-11-2016
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    если файл значителен по размеру то предпочтительнее использовать findstr вместо find.
    Быстродействие разительно отличается.
     
    Добавлено:
    Unnicked
    Цитата:
    'type "%infile%"^| find/i "%str%"
    а это вообще самая медленная конструкция из возможных


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

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 23:42 09-11-2016
    Okapulka

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    NIKZZZZ
    Цитата:
    Всем хороши батники, но с текстом нормально работать нормально не умеют.
    Я уже и сама не рада, что затеяла всё это. Спасибо тебе, добрый человек!
     
    Последний вариант похоже спотыкается на "!". В окне консоли многократные сообщения: "Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.", а в выходных файлах отсутствует выделенное красным: "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">".
     
    Может для данной задачи лучше утилиту какую-нибудь задействовать, вроде gawk или sed?

    Всего записей: 171 | Зарегистр. 14-05-2016 | Отправлено: 04:25 10-11-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