Ru-Board.club
← Вернуться в раздел «Microsoft Windows»

» Задачи на bat-файлах 3

Автор: Maza Faka
Дата сообщения: 18.07.2007 09:23
mitrichbel
Ты пробовал последний код?
Автор: Nagual
Дата сообщения: 18.07.2007 11:17
Maza Faka
почему бы не использовать more вместо echo?
он корректно пашет со спецсимволами (детально смотреть и тестить код нет времени)


Добавлено:
ок вижу ты уже его используешь
Автор: mitrichbel
Дата сообщения: 18.07.2007 12:09
Maza Faka
Последний код задачу сделал. Примерно за полчаса он справился с 18 файлами общим объёмом 912 Кб. Pentium4 3.0 MHz, 512Mb, WinXP

А всего таких файлов около тысячи, общий объём - порядка 30 Mb.

В процессе выполнения в консоли два раза было
"..." не является внутр. или внешней командой, исп. программой или пакетным файлом.
Автор: KapralBel
Дата сообщения: 18.07.2007 12:19
mitrichbel
В общем ты неправильно выбрал среду обработки
батнички очень медленны по своей природе

Надо писать на компилируемых языках
Автор: mitrichbel
Дата сообщения: 18.07.2007 14:39
KapralBel
посоветуйте?
Автор: Elroir
Дата сообщения: 18.07.2007 14:52
mitrichbel
C, C++, C#, Java
Если серьезно, то утилита sed (stream editor, ее упоминал Maza Faka) может делать достаточно серьезную обработку текста. Я не умею с ней работать, но сходу нашел в гугле пример, убирающий из текста пустые строчки.
Вот линк на страничку sed-a - http://gnuwin32.sourceforge.net/packages/sed.htm
Или может у нас здесь найдутся специалисты, знающие, как с ней работать.
Автор: Maza Faka
Дата сообщения: 18.07.2007 15:44
mitrichbel
По поводу SED-а, тебе может помочь igor_andreev, только вот, что давно не видно его в топике.
Автор: KapralBel
Дата сообщения: 18.07.2007 16:04
mitrichbel
В приват ему стукни (igor_andreev) на днях он в другом топике отметился
Автор: mitrichbel
Дата сообщения: 18.07.2007 16:24
Elroir
Maza Faka
KapralBel
Спасибо, буду пробовать
Автор: NIKZZZZ
Дата сообщения: 18.07.2007 16:30
mitrichbel
Быстро удалить все пустые с строки можно с помощью SBS2

Код: sbs2.com 0 "$0d$0a$0d$0a" "" < file.txt > tmp.txt
type tmp.txt | find /i /v "ненужный текст" >file.txt
Автор: mitrichbel
Дата сообщения: 18.07.2007 16:32
сходу нашёл http://main.rtfiber.com.tw/~changyj/sed/html/p.20060717a.html

Добавлено:
NIKZZZZ
что такое SBS2?? В "Полезных утилитах" в шапке не нашёл, поисковики выдают много шума и ссылки на упоминания sbs2 в этом топике (без подробностей).. Заговор какой-то)
Автор: 01MDM
Дата сообщения: 18.07.2007 18:26
Быстро удалить все пустые сроки в отдельно взятом файле просто:

Код:
for /f "delims=" %%i in ('type %1') do (
    echo %%i >>new%1
del %1
    )
Автор: Elroir
Дата сообщения: 18.07.2007 18:37
mitrichbel
В шапке, в разделе "Готовые решения и частые вопросы" - "Работа с текстом, датой, и файлами". Прямая ссылка - http://forum.ru-board.com/topic.cgi?forum=2&topic=2922&start=16&limit=1

01MDM
Это уже предлагали. Основные проблемы - некорректная обработка спец. символов и медленная работа на больших файлах.
Автор: vmix
Дата сообщения: 18.07.2007 18:38
Вот такая задача стоит: на сильно удаленном компе REM требуется регулярно перемещать из папки в папку кучу файлов, что очень муторно.

Хочу сделать так: запускаю на REM батник REM_FS, создающий список файлов rem_fs.txt и выкладываю на ФТП, затем на локальном компе LOC беру с ФТП rem_fs.txt и обрабатываю его батником MAKE_FS, создающий прообраз файловой системы удаленного компа (директории и файлы нулевого размера).

Затем чел на локальном компе открывает проводничком этот прообраз и мышкой работает с файлами-пустышками, и как закончит, запускает батник LOC_FS, создающий loc_fs.txt и выкладывает на ФТП.

На удаленном компе по расписанию запускается батник CHANGE_FS, который забирает с ФТП файл change_fs.txt и обрабатывает его, то есть производит изменения файловой системы на удаленном компе.

Если с REM_FS и LOC_FS все понятно (dir /S /A:D /B c:\MyDir >rem_fs.txt), то как сделать MAKE_FS и CHANGE_FS для меня непонятно..

Заранее спасибо за помощь.
Автор: NIKZZZZ
Дата сообщения: 18.07.2007 18:50
mitrichbel

Цитата:
что такое SBS2?

Вот описание
[more=sbs2.com]=============================================================
= SBS2.COM - By Herbert Kleebauer =
=============================================================

Usage: sbs2.com NUMBER "STRING1" "STRING2" <infile >outfile

infile and outfile must not be the same file!

Substitutes the NUMBER ocurrence of STRING1 in infile by
STRING2 and writes the result to outfile

You can include any character in STRING1/2 by using its
hex value (e.g. $0d for <CR> or $1a for EOF)

If NUMBER = 0 all STRING1 are substituted by STRING2

If an error is detected or nothing is substituted, erorrlevel=0
replace the original file only if errorlevel>=1 (=number of
substitutions).

Instead of the double quotes (") you can also use single quotes (')
with a different meaning for string2:
"string2" : normal substitution
'string2" : before substitution the output file is rewinded
"string2' : after substitution the outputfile is closed

some examples:

------------------------------------------------------
Substitutes the 2. occurrence of user by Susan
------------------------------------------------------
sbs2.com 2 "user" "Susan" <%1 >_._
if errorlevel 1 copy _._ %1
del _._

------------------------------------------------------
Converts dos textfiles to unix textfiles
------------------------------------------------------
sbs2.com 0 "$0d" "" <%1 >_._
if errorlevel 1 copy _._ %1
del _._

------------------------------------------------------
Converts unix textfiles to dos textfiles
------------------------------------------------------
sbs2.com 0 "$0a" "$0d$0a" <%1 >_._
if errorlevel 1 copy _._ %1
del _._

------------------------------------------------------
echo without CRLF
------------------------------------------------------
echo set a=|sbs2.com 0 "$0d$0a" "" >_.bat


------------------------------------------------------
Remove trailing blanks from all lines
------------------------------------------------------
:start
sbs2.com 0 " $0d" "$0d" <%1 >_._
if not errorlevel 1 goto ende
copy _._ %1
goto start
:ende
del _._


------------------------------------------------------
Remove all single CR LF (ascii text file -> WORD)
------------------------------------------------------
sbs2.com 0 "$0d$0a$0d$0a" "$0a" <%1 >_._
if errorlevel 1 copy _._ %1
sbs2.com 0 "$0d$0a" "" <%1 >_._
if errorlevel 1 copy _._ %1
sbs2.com 0 "$0a" "$0d$0a" <%1 >_._
if errorlevel 1 copy _._ %1
del _._

------------------------------------------------------
Extract line 5-9 from a text file
------------------------------------------------------
sbs2.com 4 "$0d$0a" '" <%1 >_._
if errorlevel 1 copy _._ %1
sbs2.com 5 "$0d$0a" "$0d$0a' <%1 >_._
if errorlevel 1 copy _._ %1

------------------------------------------------------
Source code: see older posting in alt.msdos.batch
------------------------------------------------------

=============================================================
Sample batch file to show how to use the code
=============================================================

@echo off

echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>sbs2.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU!WvX0GwUY Wv;ovBX2Gv0ExGIuht6>>sbs2.com
echo ?@}IKuNWpe~Fpe?FNHlF?wGMECIQqo{Ox{T?kPv@jeoSeIlRFD@{AyEKj@>>sbs2.com
echo iqe~1NeAyR?mHAG~BGRgB{~H?o~TsdgCYqe?HR~upkpBG?~slJBCyA?@xA>>sbs2.com
echo LZp{xq`Cs?H[C_vHDyB?Hos@QslFA@wQ~~x}viH}`LYNBGyA?@xAB?sUq`>>sbs2.com
echo LRy@PwtCYQEuFK@A~BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>>sbs2.com
echo LHsPBGyA?@xAunjzA}EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>>sbs2.com
echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?~}Nu??O>>sbs2.com
echo ~oEwoAjBKs?Zp`LBzHQzyEFrAWAG{EFrAqAGYwHTECIQ{coKIsaCsf{Oe~>>sbs2.com
echo CK}Ayre~CNFA{rAyEKFACrA{EKGAjbA}eKGSjNMtQFtc{OAyDGFj?{FDGQ>>sbs2.com
echo KAjNVk_OCAx@e?f{o?CosI}1EGizhljJ~H1ZeG}JBA~rACBMDGjjDG@g0>>sbs2.com

sbs2.com 0 "Old String" "New String" < infile > outfile
del sbs2.com
[/more]
Автор: Maza Faka
Дата сообщения: 18.07.2007 18:56
mitrichbel
Решение твоей задачи при помощи AutoIT подойдёт? Если да, то давай обсудим в PM.
Кстати проверь PM, я тебе кинул примерчик, если что-то не понятно пиши в личку!
Автор: 01MDM
Дата сообщения: 18.07.2007 18:58
Elroir

Цитата:
некорректная обработка спец. символов


Я уже спрашивал здесь о "!" и "="

Решения нет до сих пор.

Автор: Elroir
Дата сообщения: 18.07.2007 19:22
vmix
Ты как-то очень запутанно написал...
Откуда взялся файл change_fs.txt, если создавались и перемещались на ftp только rem_fs.txt и loc_fs.txt?

Цитата:
Если с REM_FS и LOC_FS все понятно (dir /S /A:D /B c:\MyDir >rem_fs.txt)

Эта команда выдаст только структуру директорий, без файлов. Я так понимаю, что и файлы нужны?


Добавлено:
01MDM
Я помню этот код - решение для него вряд-ли будет. Если знак "!" еще можно победить, то знак "=" - никак. Команда "set /p=" не воспринимает "=".
Автор: vmix
Дата сообщения: 18.07.2007 19:47
Elroir
Согласен, несколько запутанно, и change_fs.txt здесь лишний и REM_FS.BAT должен быть (dir /S /B c:\MyDir >rem_fs.txt) - поторопился, извиняюсь.
Но смысл такой: на удаленном компе снимается структура файлов с полными путями и высылается на локальный. Здесь воссоздается образ, на нем делают изменения структуры файлов и эти изменения должны отработаться на реальной структуре удаленного компа. Я не знаю как создать директории и файлы по списку rem_fs.txt и как переместить файлы согласно нового списка loc_fs.txt
Спасибо.
Автор: Elroir
Дата сообщения: 18.07.2007 21:11
vmix
Еще уточнение - когда я на локальном компе получаю список файлов, мне надо создать ту же самую структуру на локальном диске или в локальной директории?
Поясню - получили c:\test\dir1\file1, c:\test\dir2\file2. Надо создать файлы на локальном диске C: в этих же директориях или выкинуть букву диска и создать всю структуру в той директории, где я сейчас нахожусь - например d:\dir3. И тогда структура получится d:\dir3\test\dir1\file1, d:\dir3\test\dir2\file2 ?
Автор: king_stiven
Дата сообщения: 18.07.2007 21:35
У меня gsar выдаёт ошибку при попытке заменить текст со слэшем \ . Что можно сделать? Использую так:

Код: gsar.exe -s"старый текст \старый текст" -r"новый текст\новый текст" -o "1.txt
Автор: Elroir
Дата сообщения: 18.07.2007 22:52
king_stiven
Вместо "\", ставь ":134" ":092".

Код:
gsar.exe -s"старый текст :092старый текст" -r"новый текст:092новый текст" -o "1.txt
Автор: king_stiven
Дата сообщения: 18.07.2007 23:10
Elroir

Цитата:
Вместо "\", ставь ":134" ":092".

Не получится, так как слэш подставляется с текстом из переменной. Попробовал
replacer, заменяет корректно. Буду ещё её тестить на остальные символы ! % и т.д.



Автор: wolf0425
Дата сообщения: 19.07.2007 00:30
king_stiven

Цитата:
Не получится, так как слэш подставляется с текстом из переменной.

кто ж мешает перед вызовом заменить в переменной слэш на ":092" ??
заодно с другими недопустимыми символами
set "var=%var::=:058%"
set "var=%var:\=:092%"
set "var=%var:"=:034%"

mitrichbel
я тут посмотрел сколько накопилось рабочих строк в конфигах моего чистильщика текстов - оказалось в сумме 33 замены с вызовом gsar и несколько раз вызывается sed - у которого в сумме конфигов на 55 разных строк поисков/замен.
мегабайтный файл перелопачивается секунд 10-15 (АМД2500).
Удаление лишних разрывов строк и вставка нужных в эти 88 строк конфигов понятно входит, так что мне сложно понять - как можно довести батник простых замен до состояния

Цитата:
Выполнялся батник очень долго - около часа (AMD 2200, 512Mb, XP) разбирался с двумя десятками файлов общим объёмом в мегабайт.
чего там может занимать СТОЛЬКО времени...
Автор: mitrichbel
Дата сообщения: 19.07.2007 09:57
wolf0425
Блок-схему или описание я бы ещё понял, но этот код - нет, не умею :/
Автор: king_stiven
Дата сообщения: 19.07.2007 10:30
wolf0425

Цитата:
кто ж мешает перед вызовом заменить в переменной слэш на ":092" ??
заодно с другими недопустимыми символами
set "var=%var::=:058%"
set "var=%var:\=:092%"
set "var=%var:"=:034%"

У меня не получается, делал так:

Код: for /f "usebackq tokens=*" %%d in (`dir "%%c\*.mp3" /o /b /s /a:-d`) do (
set "%%~dpc=%%%~dpc:\=:092%"
echo %%d>1.txt
echo %%~dpc>2.txt
for /f "usebackq tokens=*" %%g in ("2.txt") do (
gsar.exe -f -s"%%g" -r"%новый текст%" -o 1.txt 3.txt
Автор: wolf0425
Дата сообщения: 19.07.2007 10:36
mitrichbel а какое место кода непонятно?
Автор: mitrichbel
Дата сообщения: 19.07.2007 10:40
wolf0425
я вообще незнаком, по сути
Автор: wolf0425
Дата сообщения: 19.07.2007 10:43
king_stiven внутри for последовательные действия с переопределением %переменных% делать нельзя, можно только с !переменными! (а у тех - свои ограничения).
так что для таких множественных замен проще всё действие из for выносить с помощью call.

а set "%%~dpc=%%%~dpc:\=:092%" - вообще ересь, %%~c переопределять невозможно, будет переопределяться переменная с именем равным значению (~функции!) %%~dpc

т.е., если я правильно понял что ты хотел сделать - выглядеть должно так

Код: setlocal enabledelayedexpansion
for /f "usebackq tokens=*" %%d in (`dir "%%c\*.mp3" /o /b /s /a:-d`) do (
set "tempvar=%%~dpc"
echo %%d>1.txt
gsar.exe -f -s"!tempvar:\=:092!" -r"%новый текст:\=:092%" -o 1.txt 3.txt
)
Автор: king_stiven
Дата сообщения: 19.07.2007 12:04
wolf0425
Да, я уже разобрался с переменными, всё получилось через setlocal enabledelayedexpansion и !. Но если в названии файла или папки встречается ! , то опять 25. Так что replacer подходит. А в названиях папок и файлов нет <> и непечатаемых знаков (?).А у gsar только эти три знака являются проблемными?

Цитата:
set "var=%var::=:058%"
set "var=%var:\=:092%"
set "var=%var:"=:034%"

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566

Предыдущая тема: Автозагрузка терминальной сессии


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.