Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

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

Ответить
Настройки темы
CMD/BAT - [решено] Поиск замена текста
csp csp вне форума

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


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

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


гм неполистал форум прошу прощения на следующей страницы похожая тема. если не выйдет. отпишу нижу

Отправлено: 01:39, 25-03-2012

 

Старожил


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

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


помогите, пожалуйста решить этот вопрос
http://forum.oszone.net/post-2782789.html#post2782789

спасибо

Отправлено: 17:46, 06-12-2017 | #11



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

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


Аватара для UncleD

Пользователь


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

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


Что-то пошло не так. Нужно в текстовом файле найти текст "ПоказательТипа=0" и заменить его на "ПоказательТипа=", но после выполнения скрипта

Код: Выделить весь код
Set infile=1.txt 
Set find=ПоказательТипа=0 
Set replace=ПоказательТипа=

setlocal enabledelayedexpansion 
for /F "tokens=* delims=," %%n in (!infile!) do ( 
set LINE=%%n 
set LINE=!LINE:%find%=%replace%! 
@echo !LINE!>>2.txt 
)
endlocal
получаю в файле "0=ПоказательТипа==0", так понимаю, что это из-за того что интерпритатор считает "=" служебным символом, а не текстом. Пробовал заключать все значение в кавычки и экранировать "^=", результат тот же или никакой. Как заставить интерпретатор воспринимать всю строку как текстовое выражение?

Отправлено: 13:16, 17-07-2019 | #12


Ветеран


Contributor


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

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


Код: Выделить весь код
@Echo Off
cls
	Set "FileIn=Z:\Где файл\1.txt"
	Set "Fin=ПоказательТипа=0"
	Set "Rep=ПоказательТипа="

	mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
1.txt должен быть в кодировке 1251
Чтобы решить задачу для конкретного построения файла средствами CMD прикрепите к сообщению Ваш файл 1.txt, надо понимать, например, текст "ПоказательТипа=0" единственный в строке или он внутри другого текста, есть ли другие строки, содержащие =, есть ли строки без =

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 17-07-2019 в 18:28.

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

Отправлено: 15:39, 17-07-2019 | #13


Аватара для UncleD

Пользователь


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

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


Вложения
Тип файла: txt 1.txt
(4.0 Kb, 6 просмотров)

Цитата megaloman:
1.txt должен быть в кодировке 1251 »
Видимо потому сходу и не отработал, но пока менять ничего не пытался.
Цитата megaloman:
Чтобы решить задачу для конкретного построения файла средствами CMD прикрепите к сообщению Ваш файл 1.txt, надо понимать, например, текст "ПоказательТипа=0" единственный в строке или он внутри другого текста, есть ли другие строки, содержащие =, есть ли строки без = »
Прикрепляю. Это суть есть выгрузка платежных поручений из 1С, но банк клиент не хавает одну эту строчку в исходном виде. Строчка эта есть не в каждой платежке, ну и не в каждой секции документа соответственно. Для примера оставил только три документа, нужная строка есть только в секции первого.

Отправлено: 08:25, 18-07-2019 | #14


Ветеран


Contributor


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

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


UncleD, Основываясь на Вашем файле, задачу формулирую так:
Есть текстовый файл без пустых строк в 1251 (Windows) кодировке.
Надо заменить в файле строку с указанным текстом на другую.
Код: Выделить весь код
@Echo Off
cls
>NUL Chcp 1251

	Set "FileIn=Z:\Где файл\11.txt"
	Set "Find=ПоказательТипа=0"
	Set "Repl=ПоказательТипа="

	Set /A NN=1000000, N=0
	FOR /F "usebackq tokens=1* delims=:" %%i IN (`2^>nul FINDSTR /R /N /C:".*" "%FileIn%"`) DO (
		Set /A N=%NN%+%%i &Call Set "@@@%%N%%=%%j"
	)
	FOR /F "usebackq skip=2 tokens=1* delims=[]" %%i IN (`2^>nul Find /I /N "%Find%" "%FileIn%"`) DO (
		Set /A M=%NN%+%%i  &Call Set "@@@%%M%%=%Repl%"
	)
	>"%FileIn%" (FOR /L %%a IN (1000001,1,%N%) DO Call Echo %%@@@%%a%%)
Pause
GoTo :Eof
Моё предыдущее решение делает более общую задачу: ищется указанный текст, и не важно, где он расположен, в том числе и внутри строки, и меняется именно текст, а не строка. Он более устойчив ко всяким служебным для CMD символам в тексте. Дублирую его в минимально изменённом виде:
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Set "FileIn=Z:\Где файл\11.txt"
	Set "Fin=ПоказательТипа=0"
	Set "Rep=ПоказательТипа="

	mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
Чтобы не было никакой путаницы с кодировками, оба этих скрипта должны быть написаны в 1251 (Windows) кодировке.

Постскриптум: Обнаружил, что первый скрипт из приведенных (чистый CMD) Вам не годится из-за наличия в тексте служебных для CMD символов. Например: в 80 строке пропадает %. Какие еще извращения возможны- не берусь судить, поэтому наилучший вариант Скрипт.VBS
Код: Выделить весь код
FileIn = "Z:\Где файл\11.txt"
Fin = "ПоказательТипа=0"
Rep = "ПоказательТипа="

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FF = FSO.OpenTextFile(FileIn, 1)
InTxt = FF.ReadAll
FF.Close

Set FF = FSO.OpenTextFile(FileIn, 2, True)
FF.Write Replace(InTxt, Fin, Rep)
FF.Close

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 18-07-2019 в 10:38.

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

Отправлено: 10:18, 18-07-2019 | #15


Аватара для UncleD

Пользователь


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

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


megaloman, спасибо, все сработало.
В итоге воспользовался вторым вариантом, то есть этим:
Код: Выделить весь код
@Echo Off
cls
>nul Chcp 1251
	Set "FileIn=Z:\Где файл\11.txt"
	Set "Fin=ПоказательТипа=0"
	Set "Rep=ПоказательТипа="

	mshta vbscript:execute("Set FSO = CreateObject(""Scripting.FileSystemObject"") : Set FF = FSO.OpenTextFile(""%FileIn%"", 1) : InTxt = FF.ReadAll : FF.Close : Set FF = FSO.OpenTextFile(""%FileIn%"", 2, True) : FF.Write Replace(InTxt, ""%Fin%"", ""%Rep%"") : FF.Close :close")
Pause
Exit /B
Единственно убрал Pause, чтобы скрипт не ждал эникея и еще /B, ведь если я правильно понял, то он нужен в случае, когда мой скрипт вызывал бы еще один или я что-то путаю?
Еще нашел в сети vbs, через который вызываю свой батник, а он прячет окно командной строки, ну просто чтобы не пугать пользователя регулярно выскакивающими непонятками, хотя решение и не очень элегантное.
Код: Выделить весь код
Set WshShell = CreateObject("WScript.Shell")
WshShell.Run chr(34) & "replace.bat" & Chr(34), 0
Set WshShell = Nothing
После отработки скрипта на всякий случай сравнил в Ворде исходный и итоговый файл, он других отличий кроме отсутствующего нуля он не нашел.
Еще раз благодарю.

Отправлено: 15:26, 18-07-2019 | #16


Ветеран


Contributor


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

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


UncleD, нормальные герои всегда идут в обход? Почему сразу не запускать vbs-вариант? СкрипачБатник не нужен. Или Вы что-то не договариваете? Например, надо в скрипт имя файла передавать?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

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

Отправлено: 15:35, 18-07-2019 | #17


Аватара для UncleD

Пользователь


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

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


Цитата megaloman:
Например, надо в скрипт имя файла передавать? »
Ага, жуть как стесняюсь признаться что ничерта в этом не понимаю и не знаю как это в один скрипт объединить)

Отправлено: 08:01, 19-07-2019 | #18


Аватара для UncleD

Пользователь


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

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


Цитата megaloman:
Вас надо уговаривать, или сами подробно расскажите задачу? Что надо сделать? »
Уговорили). Есть Бухгалтер работающий с интернет клиентом банка, ему нужно туда выгружать платежки из 1С, она в свою очередь выгружает их в текстовый файл, часть которого я скидывал раньше. После перехода с обычного установленного банк-клиента на онлайн версию, часть платежек начала отклоняться. Как выяснилось, причина в этой строке, той что "ПоказательТипа=0" в новых версиях нет и не должно быть "0". Лезть в конфу 1С без малейшего понимания, чтобы исправить формат выводимого файла там, нет никакого желания, так что решил пойти более менее понятным мне путем с батником в планировщике, который будет с некоторой периодичностью заменять эту строку в уже выгруженном файле, чтобы бух потм мог спокойно скормить его банку. Если закинуть батник в планировщик как есть, то при его выполнении на экране выскакивает черное окно консоли, согласитесь некрасиво, вот потому и искал способ это окно убрать, нашел и применил в меру своих познаний.

Отправлено: 12:24, 19-07-2019 | #19


Ветеран


Contributor


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

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


UncleD, откуда берётся имя файла? И в чём затруднение вставить vbs скрипт в планировщик, вроде Вы это можете?
Вот доработка vbs-скрипта c целью исключения перезаписи входного файла в случае, если строка для замены не найдена (то есть, на практике, ранее эта замена уже планировщиком была сделана)
Код: Выделить весь код
FileIn = "Z:\Где файл\11.txt"
Fin = "ПоказательТипа=0"
Rep = "ПоказательТипа="

Set FSO = CreateObject("Scripting.FileSystemObject")
Set FF = FSO.OpenTextFile(FileIn, 1)
InTxt = FF.ReadAll
FF.Close

If InStr(1, InTxt, Fin) <> 0 Then
    Set FF = FSO.OpenTextFile(FileIn, 2, True)
    FF.Write Replace(InTxt, Fin, Rep)
    FF.Close
End If

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 19-07-2019 в 15:22.

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

Отправлено: 13:55, 19-07-2019 | #20



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Поиск и замена текста ajakzs Скриптовые языки администрирования Windows 18 08-08-2013 16:10
CMD/BAT - Поиск и замена текста через bat Lilless Скриптовые языки администрирования Windows 0 28-02-2012 02:08
CMD/BAT - [решено] Поиск, остановка процесса, поиск и замена файла на разных дисках Gawr33 Скриптовые языки администрирования Windows 11 23-04-2011 23:09
[решено] Поиск и замена текста в файле TERMINAL AutoIt 6 16-03-2011 17:49
C/C++ - [решено] Поиск и замена текста Simpler Программирование и базы данных 15 01-12-2010 16:03




 
Переход