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

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

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

vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

   

vu1tur



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

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

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

  • Всего записей: 3690 | Зарегистр. 01-02-2003 | Отправлено: 12:40 25-01-2010 | Исправлено: bomzzz, 13:37 20-08-2010
    wolf0425



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

    Цитата:
    а что, в англицком хелпе есть copy /#   ?
    нету, а это чему-то мешает?
    когда lorents повторно спросил где прочитать про copy /# - я его послал читать хэлп по ключам, тебе виделись другие варианты лечения пациента?
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 11:11 19-07-2010 | Исправлено: wolf0425, 11:12 19-07-2010
    lorents



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

    Цитата:
    тебе виделись другие варианты лечения пациента?  



    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 11:54 19-07-2010
    mugil_cephalus

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

    Цитата:
    когда lorents повторно спросил где прочитать про copy /# - я его послал читать хэлп по ключам, тебе виделись другие варианты лечения пациента?  

    а я уж подумал, что ОПЯТЬ переводчики меня подвели
     
    Добавлено:
    wolf0425
    тебе уж пора на роялти претендовать

    Всего записей: 1072 | Зарегистр. 07-09-2009 | Отправлено: 12:05 19-07-2010
    garri671



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток!
    Есть 30 файлов (txt1.txt - txt30.txt) с разным колиством строк. Стоит задача создать из них файлы с равным количеством строк (например 60 000).

    Всего записей: 133 | Зарегистр. 18-07-2007 | Отправлено: 12:35 19-07-2010
    wolf0425



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

    Цитата:
    Стоит задача создать из них файлы с равным количеством строк (например 60 000).
    в смысле - слить вместе и порезать заново, на равные куски + хвост?
     
    вырезать кусок с 1 по 60000 строку - sed -n -e "1,60000 p" <in >out

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 14:12 19-07-2010 | Исправлено: wolf0425, 15:26 19-07-2010
    garri671



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

    Цитата:
    в смысле - слить вместе и порезать заново, на равные куски + хвост?

    Совершенно верно!

    Всего записей: 133 | Зарегистр. 18-07-2007 | Отправлено: 17:59 19-07-2010
    Con

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

    Цитата:
    отсюда вытаскивай пути: pv -e | find "буква:\"
    или отсюда: pv -o"%f" *.exe | find /i "буква:\"(в батнике знак "%" удваивать конечно)
    FOR /? в помощь...
    pv тут: http://www.teamcti.com/pview/prcview.htm
    покилять: pv -k  

    Спасибо, подошло. Правда сделал все проще.
    pv.exe -k -l"%MY_DISK%:\*" -f

    Всего записей: 40 | Зарегистр. 29-01-2007 | Отправлено: 20:02 19-07-2010 | Исправлено: Con, 20:03 19-07-2010
    wolf0425



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

    Цитата:
    Совершенно верно!
    как-то так:

    Код:
    @echo off
    rem (txt1.txt - txt30.txt)  
    cd . >total.txt
    for /l %%i in ( 1,1,30 ) do 1>>total.txt more txt%%i.txt
     
    set _begin=1
    set _step=6
    set _filen=1
     
    :loop
    call :_print new_%_filen%.txt  
    if errorlevel 1 goto :loop
     
    del total.txt
    goto:eof
     
    :_print
    set /a _end = %_begin% + %_step% - 1
    sed -n -e "%_begin%,%_end% p" <total.txt >%1
    set /a _begin += %_step%
    set /a _filen += 1
    if "%~z1" neq  "0" exit /b 1
    del %1
    Exit /b 0
     

    sed найдешь в шапке или в яндексе
    ну и 6 на 60000 поменяй в set _step=6

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 20:48 19-07-2010 | Исправлено: wolf0425, 20:50 19-07-2010
    garri671



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

    Всего записей: 133 | Зарегистр. 18-07-2007 | Отправлено: 05:37 21-07-2010
    res2001



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

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set "max=10"
    set "allfile=.\1\txtall.txt"
    set "indir=.\1\"
    set "outdir=.\2\"
     
    del /f/q %allfile%
    for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt & >>%allfile% echo.
    set /a "count=0"
    for /f "tokens=*" %%a in (%allfile%) do set /a "count+=1"
    set /a "p=count/max"
    set /a "p1="count-p*max"
    set /a "tek=0"
    for /l %%a in (1;1;%max%) do (
        if %%a leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
        set /a "it=0"
        set "skp=!tek!"
        set /a "is=0"
        for /f "delims=" %%b in (%allfile%) do (
            if !is! geq !tek! call :writefile %outdir%txt%%a.txt %%b
            set /a "is+=1"
    ))
     
    :writefile
    if !it! lss !p2! (
        >>%1 echo.%2
        set /a "it+=1"  
        set /a "tek+=1"
    )  
     

    Без дополнительных утилит.
    Сначала установи переменные
    max - количество файлов
    allfile - файл куда будут собираться все файлы
    indir - каталог входных файлов
    outdir - каталог где будут создаваться файлы.
     
    Кстати: сделать как ты пишешь, т.е. разделить поровну на все файлы, а в последнем остаток не получится - остаток может быть больше, чем количество строк в предыдущих файлах - не комильфо. Я сделал так - остаток раскидываю в первые несколько файлов по одной дополнительной строке. Например имеем 25 строк в итоговом файле, всего 10 файлов, в первых 5 файлах по 3 строки, в последних 5 - 2.
    На сколько быстро будет работать на больших объемах - х.з. Самому интересно. Протестируй, отпишись.
     
     
    Добавлено:
    wolf0425
    Когда бился над вышеприведенным скриптом обнаружилась одна странность, оказалось, что в for /f в опциях нельзя вставлять переменные. Я пробовал заюзать переменный skip - постоянно вылазила ошибка с непредвиденным появлением чего-либо (for /f "skip=%vv%" ...). Может что не так делал?
    Пробовал экранировать и двойные % и использовать ! вместо процентов - пофиг.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 09:03 21-07-2010 | Исправлено: res2001, 10:35 21-07-2010
    wolf0425



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

    Цитата:
    Я пробовал заюзать переменный skip - постоянно вылазила ошибка с непредвиденным появлением чего-либо (for /f "skip=%vv%" ...). Может что не так делал?  
    в тривиальном случае всё работает:
    @echo off
    set ln=5
    for /f "skip=%ln% delims=" %%a in ('dir /b ') do echo %%a
     
    там главное чтоб skip=0 не получалось, других ограничений не припомню.  
    а у тебя анверно оно и есть.
    так что или извертываться и проверив специально в случае 0 ничего не подставлять, или вообще скип сделать через more +n
     
    А вот насколько быстро for лопатит файл на миллион(ы) строк - вопрос интересный, у меня как-то оптимизма нет. зато фор можно делать вообще без скипа, однопроходным, меняя имя выходного файла просто по ходу.
     
     
    ну и как garri671 отнесется к игнорированию пустых строк - непонятно. и стартовые пробелы точно зря выкидываешь.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 10:28 21-07-2010 | Исправлено: wolf0425, 10:31 21-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    skip=0 было конечно в первой итерации, пробовал обходить этот момент.
    Протестирую еще, наверно сам где-то тупил.
    Стартовые пробелы поправил.
    С пустыми строками можно побороться используя findstr /n.
    Ща че-нить сваяем
     
    Добавлено:
    findstr то же отбрасывает пустые строки
     
    Добавлено:
    Вот усовершенствованная версия:

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set "max=10"
    set "allfile=.\1\txtall.txt"
    set "indir=.\1\"
    set "outdir=.\2\"
     
    del /f/q %allfile%
    for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt & >>%allfile% echo.
    set /a "count=0"
    for /f "delims=" %%a in (%allfile%) do set /a "count+=1"
    set /a "p=count/max"
    set /a "p1="count-p*max"
    set /a "fn=1"
    set /a "it=0"
    for /f "delims=" %%b in (%allfile%) do (
        if !fn! leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
        if !it! geq !p2! set /a "it=0" & set /a "fn+=1"
        >>%outdir%txt!fn!.txt echo.%%b
        set /a "it+=1"
    )
     

    Убрал вложенные циклы.
    С игнорированием пустых строк пока ничего не получилось.
    Сделал замеры времени, обрабатывал 10 файлов в каждом по 59999 строк в одном из них 119 тыс. строк. Полная обработка заняла 3 мин. 14 сек.
    Антивирус тормозит процесс капитально, время обработки увеличивается в разы, я не дождался варианта с включенным антивирусом (ждал >10 мин.).

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 10:39 21-07-2010 | Исправлено: res2001, 13:08 21-07-2010
    wolf0425



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

    Цитата:
    findstr то же отбрасывает пустые строки  
    гонишь
    for /f "tokens=1* delims=]" %%a in (' find /n /v "" ^<file') do echo.%%b
    перед  echo вписываешь счетчики и всякие условия...
     
    наиболее непонятно - какие ограничения по символам в тех логах, если есть спецсимволы - фор сразу идет лесом.

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 13:25 21-07-2010 | Исправлено: wolf0425, 13:32 21-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    спс. за подсказку, я так пытался: findstr /n /r "." - все пустые строки повыдирал
     
    Добавлено:

    Код:
    @echo off
    setlocal enabledelayedexpansion
    set "max=10"
    set "allfile=.\1\txtall.txt"
    set "allfile2=.\1\txtall1.txt"
    set "indir=.\1\"
    set "outdir=.\2\"
     
    del /f/q %allfile%
    for /l %%a in (1;1;%max%) do >>%allfile% type %indir%txt%%a.txt
    find /n /v "" %allfile% >%allfile2%
    set /a "count=0"
    for /f "delims=" %%a in (%allfile2%) do set /a "count+=1"
    set /a "p=count/max"
    set /a "p1="count-p*max"
    set /a "fn=1"
    set /a "it=0"
    for /f "tokens=1,* delims=]" %%a in (%allfile2%) do (
        if !fn! leq %p1% (set /a "p2=p+1") else (set /a "p2=p")
        if !it! geq !p2! set /a "it=0" & set /a "fn+=1"
        >>%outdir%txt!fn!.txt echo.%%b
        set /a "it+=1"
    )
    del /f/q %allfile%
    del /f/q %allfile2%
     

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 14:20 21-07-2010 | Исправлено: res2001, 14:47 21-07-2010
    wolf0425



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

    Цитата:
    я так пытался: findstr /n /r "." - все пустые строки повыдирал  
    тоже вариант, только надо было findstr /n /r ".*"
    или findstr /n /r "^"
     
    а какая польза в set /a от кавычек? я как-то вообще люблю там лишние пробелы для читаемости вписывать, благо они вроде нормально игнорируются. типа set /a var += 1

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 15:16 21-07-2010 | Исправлено: wolf0425, 15:22 21-07-2010
    res2001



    Silver Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    wolf0425
    С регулярными выражениями у меня тяжело, практики нет.

    Цитата:
    какая польза в set /a от кавычек?

    да так на всякий случай, чтоб ничего лишнего туда не попало.
    Я последнее время все сеты с кавычками делаю, уже на автомате получается.

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 15:35 21-07-2010
    lorents



    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Какие символы не должны быть в имени файла, чтобы его понимал *.bat?
    Я знаю & ^ % !
    Просто хочу написать предупреждение, какие символы не использовать?
    А вообще, как это можно исправить?

    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 18:47 21-07-2010 | Исправлено: lorents, 18:49 21-07-2010
    wolf0425



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

    Цитата:
    Я знаю & ^ % !  
    а ты проверь ещё  '(),;+={}[]
     

    Всего записей: 2929 | Зарегистр. 25-04-2007 | Отправлено: 19:56 21-07-2010
    lorents



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

    Цитата:
    а ты проверь ещё  '(),;+={}[]  

    Проверил, теперь их пять символов & ^ % ! ;
     
    Это можно исправить?

    ----------
    Image Catalyst - оптимизация изображений без потери качества

    Всего записей: 3299 | Зарегистр. 30-12-2007 | Отправлено: 20:10 21-07-2010 | Исправлено: lorents, 20:12 21-07-2010
    res2001



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

    Цитата:
    Это можно исправить?

    Это уже к микрософту вопрос

    Всего записей: 2580 | Зарегистр. 11-04-2003 | Отправлено: 08:54 22-07-2010
       

    Страницы: 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 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199

    Компьютерный форум Ru.Board » Операционные системы » Microsoft Windows » Задачи на bat-файлах 8
    vu1tur (04-09-2010 17:46): http://forum.ru-board.com/topic.cgi?forum=62&topic=21297


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

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

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru