Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как добавить текст в середину текстрового файла

Ответить
Настройки темы
CMD/BAT - Как добавить текст в середину текстрового файла

Новый участник


Сообщения: 9
Благодарности: 0

Профиль | Отправить PM | Цитировать


Есть текстовый файл 1.txt:

__________________________
aaa

[paste]

ccc
__________________________

К примеру [paste] нужно заменить на bbb, при этом пустые строки должны остаться (FOR /F не помог)

Отправлено: 09:54, 04-01-2010

 

Аватара для BigBoo

Старожил


Автор проектов


Сообщения: 474
Благодарности: 120

Профиль | Отправить PM | Цитировать


amel27, А можно ли так же использовать переменную для имени параметра, то есть в данном примере вместо ссс. Так работать не хочет:
Код: Выделить весь код
set "$ByRef="a 1","b 2","c 3""  
set "$val="a 1","b 2","c 3""
CALL:INISET 1.ini paste $ByRef $val

Отправлено: 16:32, 20-04-2011 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата BigBoo:
можно ли так же использовать переменную для имени параметра »
можно совместить оба способа (по аналогии):
Код: Выделить весь код
@echo off

set "$par=ccc"
set "$val="a 1","b 2","c 3""
CALL:INISET 1.ini paste $par $val
EXIT

:INISET  %file_path% %section% parm val
::---------------------------------------
SETLOCAL DisableDelayedExpansion
set $sn= & set $vf=0& set "$ft=%TEMP%\%RANDOM%%RANDOM%.tmp"
(for /f "tokens=1,2* delims==:" %%a in ('findstr /n "$" "%~1"') do (
 set "$b=%%b"& set "$c=%%c"
 SETLOCAL EnableDelayedExpansion
 if defined %~3 (set $3=!%~3!) else set "$3=%~3"
 if defined %~4 (set $4=!%~4!) else set "$4=%~4"
 if "!$b:~0,1!"=="[" set "$sn=!$b:~1,-1!"
 set $lf=_& if /i "!$sn!"=="%~2" if /i "!$b!"=="!$3!" set "$lf="
 if defined $c set "$c==!$c!"
 if defined $lf echo/!$b!!$c!
 if "!$sn!"=="%~2" if "!$vf!"=="0" set $vf=1& echo !$3!=!$4!
 for /f "tokens=1,2 delims=:" %%i in ("!$sn!:!$vf!") do (
ENDLOCAL& set "$sn=%%i"& set "$vf=%%j")))>"%$ft%"
copy /y "%$ft%" "%~1">nul&& del "%$ft%"
::----------------
ENDLOCAL& GoTo:EOF
> ByRef - префикс, обозначающий использование параметра по ссылке;
> очень странное имя для параметра... на всякий случай: оно не должно содержать символов ":" и "="
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:48, 20-04-2011 | #22


Аватара для BigBoo

Старожил


Автор проектов


Сообщения: 474
Благодарности: 120

Профиль | Отправить PM | Цитировать


amel27, спасибо, теперь всё работает как надо.
Цитата amel27:
очень странное имя для параметра »
Имелись ввиду ini-файлы "Оперы", а именно параметр standard_menu.ini:
Код: Выделить весь код
[Quick Preferences Menu]
Item, "Speed Dial - логотип вместо страницы" = Set preference,"User Prefs|Thumbnail Logo Score Logo URL=75" | Set preference,"User Prefs|Thumbnail Logo Score Logo URL=0"
Скрипт задумывался как часть твика для установленной Opera 11.10.

Отправлено: 18:02, 20-04-2011 | #23


Аватара для BigBoo

Старожил


Автор проектов


Сообщения: 474
Благодарности: 120

Профиль | Отправить PM | Цитировать


Попробовал на реальном standard_menu.ini и обнаружилась новая проблема, связанная с кодировкой. Дело в том, что standard_menu.ini в кодировке UTF-8, и после отработки скрипта вместо русских букв получаем:
Код: Выделить весь код
Item, "Speed Dial - ⨯ ⢮ ⣠穢= и т.д.
Хоть CMD-файл в OEM-866, ANSI-1251 - всё равно, а если для прикола сохранить в UTF-8 - скрипт такое с standard_menu.ini вытворяет, мама не горюй! Извиняюсь, может несколько не в эту тему, как в скрипте указать, что русские буквы должны находиться в UTF-8?
p.s. С кодировкой standard_menu.ini всё в порядке, скрипт её не меняет, если русские буквы не использовать - всё отрабатывает корректно!

Отправлено: 18:40, 20-04-2011 | #24


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


BigBoo, возможно, Вам стоит перейти на использование WSH, а ещё лучше — PowerShell.

Отправлено: 19:03, 20-04-2011 | #25


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата BigBoo:
обнаружилась новая проблема, связанная с кодировкой »
именно поэтому нужно сразу давать пример, максимально приближенный к "боевым" условиям, а не тот куцый, что из первого поста
Цитата BigBoo:
а если для прикола сохранить в UTF-8 - скрипт такое с standard_menu.ini вытворяет, мама не горюй »
на самом деле, если всё аккуратно сделать - убрать BOM и заэкранировать спецсимволы, то всё работает... просто в батнике в команде SET вместо русских букв будут "крякозябки", но ему по большому счету всё равно что менять... и понятное дело, учет регистра букв работать не будет

напрямую батник с UTF8 работать не может, так как для Windows "родными" являются OEM/ANSI/UTF-16 кодировки, но можно сделать предварительное преобразование в любую из этих кодировок, а после обработки вернуть в исходную (UTF8), вот пример для исходного файла UTF-8 with BOM:
читать дальше »
Код: Выделить весь код
@echo off

set $par=Item, "Speed Dial - логотип вместо страницы"
set $val=Set preference,"User Prefs|Thumbnail Logo Score Logo URL=75" ^| Set preference,"User Prefs|Thumbnail Logo Score Logo URL=0"

CALL:INISET 1.txt paste $par $val
EXIT

:INISET  %utf8_file_with_BOM% %section% parm val
::----------------------------------------------
SETLOCAL DisableDelayedExpansion
set $sn= & set "$t1=%TEMP%\%RANDOM%%RANDOM%.tmp"
set $vf=0& set "$t2=%TEMP%\%RANDOM%%RANDOM%.tmp"
chcp 65001|cmd/u/c Type "%~1">"%$t1%"&chcp 866>nul

(for /f "tokens=1* delims==]" %%a in ('type "%$t1%"^|find/n /v ""') do (set "$b=%%b"
 SETLOCAL EnableDelayedExpansion
 if "!$b:~0,1!"=="[" set "$sn=!$b:~1,-1!"
 for /f "delims==" %%p in ("!$b!") do set "$p=%%p"
 if /i not "!$sn!"=="%~2" (echo/!$b!) else (
 if /i not "!$p!"=="!%~3!" if /i not "!$p!"=="!%~3! " echo/!$b!)
 if "!$sn!"=="%~2" if "!$vf!"=="0" set $vf=1& echo/!%~3!=!%~4!
 for /f "tokens=1,2 delims=:" %%i in ("!$sn!:!$vf!") do (
 ENDLOCAL& set "$sn=%%i"& set "$vf=%%j"
)))>"%$t2%"

set/p $="я╗┐">"%$t1%"<nul
(for /f "usebackq delims=" %%a in ("%$t2%") do (set "$a=%%a"
CHCP 65001|cmd/v/c "echo/!$a!"&CHCP 866>nul))>>"%$t1%"

copy /y "%$t1%" "%~1">nul&& del "%$t1%"
::----------------
ENDLOCAL& GoTo:EOF

P.S. красным выделен BOM для UTF-8, лучше скопировать его с любого UTF8-текстовика
P.P.S. если исходный файл не содержит BOM, код придется изменить

Последний раз редактировалось amel27, 22-04-2011 в 04:45. Причина: оформление

Это сообщение посчитали полезным следующие участники:

Отправлено: 07:05, 21-04-2011 | #26


Аватара для BigBoo

Старожил


Автор проектов


Сообщения: 474
Благодарности: 120

Профиль | Отправить PM | Цитировать


Цитата amel27:
красным выделен BOM для UTF-8, лучше скопировать его с любого UTF8-текстовика »
Если честно, так и не понял. Что имеется ввиду под "скопировать BOM с любого UTF8-текстовика" и как это сделать?
И ещё вопрос: cmd-файл со скриптом в Вашем последнем примере сохраняется в OEM-866?

Отправлено: 10:57, 21-04-2011 | #27


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата BigBoo:
cmd-файл со скриптом в Вашем последнем примере сохраняется в OEM-866? »
да
Цитата BigBoo:
Что имеется ввиду под "скопировать BOM с любого UTF8-текстовика" и как это сделать? »
- создать в блокноте произвольный текст и сохранить его в файл в формате UTF-8;
- открыть полученный UTF8-файл в текстовом редакторе как DOS-текст (блокнот не поддерживает, я использую FAR);
- скопировать первые три спецсимвола (BOM) в отмеченное место батника;

P.S. Всё это имеет смысл только если обрабатываемые файлы Opera содержат BOM, в противном случае скрипт придется переделывать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:53, 21-04-2011 | #28


Аватара для BigBoo

Старожил


Автор проектов


Сообщения: 474
Благодарности: 120

Профиль | Отправить PM | Цитировать


amel27, испробовал Ваш скрипт с учётом "BOM". Скрипт зацикливается на ошибке и далее иероглифы:
Код: Выделить весь код
Достигнут уровень рекурсии, максимально возможный для команды SETLOCAL.
Если из INI-файла удалить всё, кроме нужной секции - отрабатывает, вставляя по одному символу в строку столбиком, где русские буквы - всё те же крякозябры.

Отправлено: 20:51, 21-04-2011 | #29


Ветеран


Сообщения: 1759
Благодарности: 966

Профиль | Цитировать


BigBoo,
Мне кажется вы выбрали не тот инструмент, голые батники плохо работают с текстом, тем более в utf8, а если конфиг большой, то есть вероятность, что он его вообще не пропарсит. Если вы хотите твик оперы, то на мой взгляд, было бы проще и надежней просто заменить файл конфига другим, модифицированным.

Отправлено: 22:42, 21-04-2011 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Как добавить текст в середину текстрового файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
ALTLinux - Как наложить на JPG текст (дата создания файла) user51 Общий по Linux 6 30-06-2008 15:37
[решено] как добавить путь к текущей директории в reg файл из bat файла ? mitiya Автоматическая установка приложений 7 27-03-2008 16:12
Как искать в поисковиках, еисли я не помню середину слова taras.v Хочу все знать 5 12-03-2008 06:41
Разное - [решено] Как в список "Символы" добавить собственные символы для вставки в текст T-IIIJ Microsoft Windows 2000/XP 4 23-02-2008 16:27
Как добавить текст в свое сообщение? Vadikan О сайте и форуме 4 17-10-2002 07:55




 
Переход