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

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



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Yvaliko
    Цитата:
    @echo off
    forfiles /s /p "D:\TestDir" /m *.txt /c "cmd /c echo @fdate">files1.lst
    del /f /q files2.lst
    for /f "tokens=1-3 delims=." %%a in (files1.lst) do >>files2.lst echo %%c%%b%%a
    set DelNum=
    for /f "tokens=* skip=3" %%a in ('sort -ur files2.lst') do (set DelNum=%%a)&&goto :Next1
    :Next1
    if "%DelNum%"=="" goto :NoFiles
    set DelDate=%DelNum:~-2%.%DelNum:~-4,2%.%DelNum:~0,4%
    forfiles /s /p "D:\TestDir" /m *.txt /d -%DelDate% /c "cmd /c echo @fdate - @file"
    goto :eof
     
    :NoFiles
    echo No files to delete.
    goto :eof
  • !!! sort нужен нестандартный, а никсовый, например из UnxUtils
     
  • D:\TestDir - папка, где искать файлы
  • /m *.txt - маска имен файлов (можно удалить совсем)
  • /s - рекурсивный поиск (и во вложенных папках)
  • files1.lst и files2.lst - временные файлы, можно поменять имена, и/или удалить потом
  • внутри второго FOR есть skip=3 - кол-во пропускаемых дат
  • первый FOR и set DelDate= настроены на формат даты ДД.ММ.ГГГГ
  • во втором FORFILES в кавычках - команда, выполняемая для каждого подходящего файла (сейчас вывод даты и имени, потом заменить на "cmd /c del /f /q @path")

  • Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 16:26 20-06-2017
    aVitaliy



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

    Цитата:
    А если есть желание померяться, то опять же - зачем? Задавшему вопрос, эта тема, видимо, уже не интересна...  

     
    Почему не интересна? Очень даже интересна. Так как решение я не нашел, а руками делать все это просто занимает кучу времени. Насчет Powershell я просто не в курсе, я впервые узнал о нем из твоего поста. Почему спрашивал как это сделать на батнике, потому как с батником хоть как-то "шапочно" знаком. Но в принципе мне все равно как это будет реализовано, мне просто нужно с этого сайта получать периодически список "игр" без лишних данных - http://steamkeys.ovh/
     
     

    Всего записей: 84 | Зарегистр. 11-01-2006 | Отправлено: 16:43 20-06-2017
    Pasha_ZZZ



    Platinum Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    aVitaliy
    Ctrl+A, Ctrl+C, вставить в Word/Excel, выделить столбец названий в таблице, вставить в текстовый файл

    Всего записей: 12360 | Зарегистр. 11-03-2002 | Отправлено: 17:01 20-06-2017
    aVitaliy



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

    Цитата:
    aVitaliy  
    Ctrl+A, Ctrl+C, вставить в Word/Excel, выделить столбец названий в таблице, вставить в текстовый файл

    Вот я туплю. Что-то совсем даже не подумал о таком простом выходе. Полный капец.  
    P.S. Спасибо!

    Всего записей: 84 | Зарегистр. 11-01-2006 | Отправлено: 17:18 20-06-2017
    YuS_2



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

    Цитата:
    нужно с этого сайта получать периодически список "игр" без лишних данных


    Код:
    @echo off
    echo Выполняем...
    powershell -executionpolicy bypass "&{$a=gc test.txt -enc UTF8;$a|%%{$_ -replace '^(?>\d+|объявлено)\t(.+?)\t.+','$1'}|out-file -enc UTF8 test_out.txt}"
    echo Готово.
    pause

    Ctrl+A, Ctrl+C на странице сайта
    Вставляем в текстовом редакторе все, что скопировали и сохраняем в файле test.txt (название, конечно же, можно изменить в скрипте) в кодировке UTF8, запускаем скрипт и на выходе получим то, что требовалось в файле test_out.txt ... всё.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 18:18 20-06-2017
    yurkesha



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

    Цитата:
    нужно с этого сайта получать периодически список "игр" без лишних данных


    Код:
    @echo off
    echo Выполняем...
    FOR /F "usebackq tokens=2 delims=    " %%a IN (test.txt) DO (ECHO %%aa)>>test_out.txt
    echo Готово.
    pause

    Ctrl+A, Ctrl+C на странице сайта
    Вставляем в текстовом редакторе все, что скопировали и сохраняем в файле test.txt (название, конечно же, можно изменить в скрипте) в кодировке WIN1251 или CP866, запускаем скрипт и на выходе получим то, что требовалось в файле test_out.txt ... всё.
     
    PS - чисто для сравнения.
    PPS - структура информации на сайте и структура ранее предоставленного образца разная(разделитель колонок <TAB> а не пробелы) поэтому разбор проще.

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 10:41 21-06-2017
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
     Приветствую. Windows 98, ком. строка. Может кто подскажет как получить системную дату в переменную?

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 11:44 21-06-2017
    dimonprodigy



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    jr13ster
    ох, ну и старина
    %date% не отрабатывает?

    Всего записей: 708 | Зарегистр. 27-02-2006 | Отправлено: 11:47 21-06-2017
    metatrop

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

    Цитата:
     
    %date% не отрабатывает?
     

     
    Если поставить cmd.exe от Windows 2000 SP4 (с патчем и при условии, что установлен KernelEx) вместо command.com, то должен по идее отрабатывать. Пробовал cmd+Win98SE+KernelEx только в виртуальной машине, и на первый взгляд всё работает, даже очень сложные .cmd скрипты. DOS-программы тоже запускаются, несмотря на то, что Win9x - это далеко не ntvdm.
     
    А так, можно утилиту GNU/MSYS использовать, date.exe, вроде бы. Можно однострочный вызов miniperl.exe сделать. Но вообще работать с command.com, а не cmd.exe - очень тяжко.

    Всего записей: 313 | Зарегистр. 17-09-2010 | Отправлено: 13:34 21-06-2017 | Исправлено: metatrop, 13:35 21-06-2017
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    metatrop
    Попробую date.exe. Может быть прокатит.
     
    metatrop
    Совет реально помог. Большая благодарность от меня.

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 13:39 21-06-2017 | Исправлено: jr13ster, 16:43 21-06-2017
    Smitis



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    jr13ster
    4dos - расширенный командный процессор для замены command.com https://www.4dos.info/
    Можно взять 4nt, но он не будет работать в DOS режиме и при загрузке. Зато может выполнять файлы с расширение cmd. https://jpsoft.com/all-downloads/previous-versions.html (там тоже есть 4dos, но более старый)


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

    Всего записей: 3177 | Зарегистр. 09-02-2003 | Отправлено: 18:37 21-06-2017
    jr13ster

    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Smitis
    Очень познавательный материал. Спасибо.

    Всего записей: 68 | Зарегистр. 12-01-2007 | Отправлено: 21:38 21-06-2017
    YuS_2



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

    Цитата:
    структура информации на сайте и структура ранее предоставленного образца разная(разделитель колонок <TAB> а не пробелы) поэтому разбор проще.

    Ну, что же, против фактов не попрешь, как говорится... это я пеплом тут голову посыпаю, в смысле
    Выдалось немного времени на тесты...
    Учитывая именно такие условия (разделители - табуляция), можно сказать, что чистый батник эффективнее...
    Тест проводился на ~1000000 строк, при размере файла ~67 Мб  
    Дальнейшее увеличение посчитал бессмысленным, относительно конкретной ситуации и на таких значениях работоспособность батника вызвала удивление...
     
    Результаты:
    чистый batch - 36 сек.
     

    Код:
    @echo off
    echo Выполняем...
    powershell -executionpolicy bypass "&{gc test.txt -enc UTF8|%%{($_.split([char]9))[1]}|out-file -enc UTF8 test_out.txt}"
    echo Готово.
    pause

    гибрид - 2 мин. 7 сек.
     
    ЗЫ
    Преимущество PS было бы явным при начальных условиях, т.е. где разделители - пробелы, в этом случае достаточно просто регэксп трансформировать под такие условия... причем без потери скорости обработки, что о batch-сценарии сказать нельзя, увы.

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 21:41 21-06-2017 | Исправлено: YuS_2, 21:53 21-06-2017
    yurkesha



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    Цитата:
    Преимущество PS было бы явным при начальных условиях, т.е. где разделители - пробелы
    само-собой - двойной проход сильно замедляет процесс...

    Всего записей: 2741 | Зарегистр. 15-12-2003 | Отправлено: 11:45 22-06-2017
    metatrop

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    YuS_2
    yurkesha
     
    Ну что ж, а однострочник на perl у меня выполняется в ~50 (!) раз быстрее .cmd файла. Проверено на файле 53 МБ, полученном многократным удвоением текста с http://steamkeys.ovh/

    Код:
     
    miniperl -pe "$_ = m/^[^\t]+\t+([^\t]+)/m ? qq'$1\n':'' " <test.txt >test_out.txt
     

    Не говоря уже о том, что этот вариант - самый краткий и требует всего лишь найти и скачать из сети miniperl.exe (версия v5.8.7 built for MSWin32-x86-multi-thread; размер файла 647219 байт).
     
    Кстати, при работе miniperl грузит одно ядро процессора полностью, cmd - одно ядро где-то на 50%, про Powershell - не знаю.
     
    Для себя давно пришёл к выводу, что для скриптов общего назначения полезны только cmd и perl (у каждого свои достоинства, мало пересекающиеся и весьма оптимально дополняющие друг друга, причём у cmd специфических достоинств куда больше, чем кажется на первый взгляд). bash - неудачный язык, лишённый многих важных возможностей и удобств cmd, сколь странным ни казалось бы такое утверждение знатокам Linux, имеющим лишь стереотипное мнение о cmd. cscript, vbs, Powershell могут быть полезны только для доступа к возможностям Windows, но никак не для общих задач работы с файлами и текстом.

    Всего записей: 313 | Зарегистр. 17-09-2010 | Отправлено: 15:53 25-06-2017 | Исправлено: metatrop, 17:43 25-06-2017
    YuS_2



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

    Цитата:
    требует всего лишь найти и скачать из сети miniperl.exe

    А также его установки и всех сопутствующих телодвижений по его изучению...
     
    Ну, хорошо, тогда возьмите вот такой скрипт powershell:

    Код:
    (gc test.txt -raw -enc UTF8) -replace '[^\t\r\n]+\s*([^\t\r\n]+)[^\n\r]+','$1'|out-file -enc UTF8 test_out.txt

    и проведите тест на своем файле.
    На моем, при всех прочих равных, он выполняется 7,5 сек. - это достаточно быстро?
    Если требуется скорость обработки, то выход найдется... причем без каких-либо сторонних программ.
     
    ЗЫ
    Хотя, с тем, что perl это то, что должно присутствовать на компьютере, скорее соглашусь...

    Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 20:16 25-06-2017 | Исправлено: YuS_2, 20:32 25-06-2017
    sis_terr



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Ребятки, спецы, помогите)  
    Обчиталась мануалов до головной боли, а простую задачку не могу решить:
    надо файл копировать в папку с датой
    Дел на три строчки, а оно не хочет класть файл в папу %date:~-10%

    Всего записей: 1301 | Зарегистр. 20-12-2007 | Отправлено: 21:06 25-06-2017
    NIKZZZZ



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

    Код:
    md %date:~-10% & copy file %date:~-10%\


    Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 21:27 25-06-2017
    sis_terr



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    я продолжаю тупить. оно файл кладёт рядом с папкой
    **
    получилось! надо уже спать идти))
    NIKZZZZ, благодарю! )

    Всего записей: 1301 | Зарегистр. 20-12-2007 | Отправлено: 21:43 25-06-2017 | Исправлено: sis_terr, 21:49 25-06-2017
    Deoptimizer

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Существует такое популярное расширение.
    Оно использует вот этот Regular Expression Syntax, так вот, стоит задача:

    Цитата:
     
    Искать в переменной строку office/любое значение/потом значения 13 ИЛИ 16 ИЛИ 365/любое значение.  

    Код:
    ECHO %var% | repl "[\s\S]*?office[\s\S]*(?=13|16|365)[\s\S]*" $1 MIX >nul

    Где потом идет обработка, есть ли результат.

    Код:
    IF !ERRORLEVEL! EQU 0 (
    )

     

    Вроде все работает, будет даже работать без знака вопроса- (x|y).
     
    Проблема в следующем, не работает исключение НЕ (?!2017):

    Цитата:
     
    d:>echo "office 2013" | repl "[\s\S]*?office[\s\S]*(?!2017)[\s\S]*" $1 MIX >nul
    d:>echo %ERRORLEVEL%
    0
    d:>echo "office 2017" | repl "[\s\S]*?office[\s\S]*(?!2017)[\s\S]*" $1 MIX >nul
    d:>echo %ERRORLEVEL%
    0
    (тут должна быть единица)
     

     
    Или как-то не так я понял Regular Expression Syntax?

    Всего записей: 315 | Зарегистр. 12-06-2015 | Отправлено: 19:30 29-06-2017 | Исправлено: Deoptimizer, 19:32 29-06-2017
       

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