Войти

Показать полную графическую версию : [решено] Изменение текста в ini файлах


Страниц : [1] 2

romfus
23-09-2020, 14:45
Добрый день. Имеются ini файлы, все они лежат в одном месте (Пусть будет D:\test).
Как можно с помощью скрипта изменить сразу несколько строк во всех ini файлах?
Нужно поменять PostMark=536871936 на PostMark=1024 и DocVersion=RTM0099 на DocVersion=RTM003-13-17

greg zakharov
23-09-2020, 14:52
romfus, приведите пример ini.

romfus
23-09-2020, 15:00
Текст ini:
[Main]
SndrFact=–Ђ”ЂЏЋ„„ ѓ€Ѓ„„ ѓ“ Њ‚„ ђ®ббЁЁ Ї® ‚®«Ј®Ја*¤бЄ®© ®Ў«
InnFact=3444012677
KppFact=344401001
Inn=3444268848
Kpp=344401001
DepCode=1118026
SndrTel=
SendCtg=2
SendDate=20200915
ListNum=78000
IndexFrom=400066
MailType=2
MailCtg=1
DirectCtg=1
PayType=2
PayTypeNot=2
TransType=1
PostMark=536871936
MailRank=8
NumContract=8.4.10-09-79
SMSNoticeS=

[Sender]
Sndr=ѓЋ‘“„Ђђ‘’‚…ЌЌЋ… ЉЂ‡…ЌЌЋ… “—ђ…†„…Ќ€… ‚Ћ‹ѓЋѓђЂ„‘ЉЋ‰ ЋЃ‹Ђ‘’€ "Ѓ…‡ЋЏЂ‘Ќ›‰ ђ…ѓ€ЋЌ"
AddressTypeSndr=1
NumAddressTypeSndr=
IndexSndr=400066
RegionSndr=‚®«Ј®Ја*¤бЄ*п
AreaSndr=
PlaceSndr=‚®«Ј®Ја*¤
LocationSndr=
StreetSndr=Ё¬. ‘Є®блॢ*
HouseSndr=2
LetterSndr=Le
SlashSndr=
CorpusSndr=
BuildingSndr=
HotelSndr=
RoomSndr=

[Summary]
MailCount=500
DeliveryRateSum=2700000
DeliveryRateVAT=540000
DeliveryRateTotal=3240000
ValueSum=0
ValueSumRateTotal=0
ValueSumRateVAT=0
NoticeRateTotal=0
NoticeRateVAT=0
SMSNoticeTotal=0
SMSNoticeVAT=0
TotalRate=3240000
TotalRateVAT=540000

[DocVersion]
DocVersion=RTM0099

greg zakharov
23-09-2020, 15:07
Погодите трошки. Сейчас накидаю.

@echo off
setlocal enabledelayedexpansion
for /r D:\test %%i in (*.ini) do call:patch "%%i"
endlocal
exit /b

:getlines
for /f %%i in ('find /c /v "" ^< "%~1"') do set "#=%%i"
exit /b

:replace
3<"%~1" (for /l %%i in (1,1,!#!) do (
set /p s=<&3
for /f "tokens=1,* delims==" %%i in ("!s!") do (
if /i "%%i" equ "postmark" (
echo:%%i=1024
) else if /i "%%i" equ "docversion" (
echo:%%i=RTM003-13-17
) else if "!s:~0,1!" equ "[" (
echo.
echo:%%i
) else echo:%%i=%%j
)
))>>"%tmp%\ini000.tmp"
move "%tmp%\ini000.tmp" "%~1" >nul
exit /b

:patch
call:getlines "%~1"
call:replace "%~1"
exit /b

romfus
23-09-2020, 16:05
Что - то вот такое получается

[Main]

SndrFact

InnFact

KppFact

Inn

Kpp

DepCode

SndrTel

SendCtg

SendDate

ListNum

IndexFrom

MailType

MailCtg

DirectCtg

PayType

PayTypeNot

TransType
PostMark=1024

MailRank

NumContract

SMSNoticeS

[Sender]

Sndr

AddressTypeSndr

NumAddressTypeSndr

IndexSndr

RegionSndr

AreaSndr

PlaceSndr

LocationSndr

StreetSndr

HouseSndr

LetterSndr

SlashSndr

CorpusSndr

BuildingSndr

HotelSndr

RoomSndr

[Summary]

MailCount

DeliveryRateSum

DeliveryRateVAT

DeliveryRateTotal

ValueSum

ValueSumRateTotal

ValueSumRateVAT

NoticeRateTotal

NoticeRateVAT

SMSNoticeTotal

SMSNoticeVAT

TotalRate

TotalRateVAT

[DocVersion]
DocVersion=RTM0003-13-17

[Main]

SndrFact

InnFact

KppFact

Inn

Kpp

DepCode

SndrTel

SendCtg

SendDate

------Пропускаю много символов ------------------
[DocVersion]
DocVersion=RTM0003-13-17




Все значения которые нужно поменять поменялись а остальные исчезли, и все это скопировалось много раз

greg zakharov
23-09-2020, 16:24
romfus, ещё раз прогнал пять тестов на сотне клонов предоставленного вами ini, но в итоге получаю корректные:

[Main]
SndrFact=ЦАФАПОДД ГИБДД ГУ МВД России по Волгоградской обл
InnFact=3444012677
KppFact=344401001
Inn=3444268848
Kpp=344401001
DepCode=1118026
SndrTel=
SendCtg=2
SendDate=20200915
ListNum=78000
IndexFrom=400066
MailType=2
MailCtg=1
DirectCtg=1
PayType=2
PayTypeNot=2
TransType=1
PostMark=1024
MailRank=8
NumContract=8.4.10-09-79
SMSNoticeS=
SMSNoticeS=

[Sender]
Sndr=ГОСУДАРСТВЕННОЕ КАЗЕННОЕ УЧРЕЖДЕНИЕ ВОЛГОГРАДСКОЙ ОБЛАСТИ "БЕЗОПАСНЫЙ РЕГИОН"
AddressTypeSndr=1
NumAddressTypeSndr=
IndexSndr=400066
RegionSndr=Волгоградская
AreaSndr=
PlaceSndr=Волгоград
LocationSndr=
StreetSndr=им. Скосырева
HouseSndr=2
LetterSndr=Le
SlashSndr=
CorpusSndr=
BuildingSndr=
HotelSndr=
RoomSndr=
RoomSndr=

[Summary]
MailCount=500
DeliveryRateSum=2700000
DeliveryRateVAT=540000
DeliveryRateTotal=3240000
ValueSum=0
ValueSumRateTotal=0
ValueSumRateVAT=0
NoticeRateTotal=0
NoticeRateVAT=0
SMSNoticeTotal=0
SMSNoticeVAT=0
TotalRate=3240000
TotalRateVAT=540000
TotalRateVAT=540000

[DocVersion]
DocVersion=RTM003-13-17
Скорее всего дело в кодировке.

romfus
23-09-2020, 16:32
Нужно скинуть ini файл? Или как то можно кодировку прописать в скрипте?

greg zakharov
23-09-2020, 16:37
У вас ini в какой кодировке?

romfus
23-09-2020, 16:42
Ansi

greg zakharov
23-09-2020, 17:05
Попробуйте "прогнать" сценарий на каком-нибудь одном файле, т.е. строчку for /r D:\test %%i in (*.ini) do call:patch "%%i" замените на call:patch D:\test\имя_существующего_файла.ini

romfus
23-09-2020, 19:00
call:patch D:\test\имя_существующего_файла.ini »
тоже самое

может к скрипту добавить шаг с перекодировкой?

greg zakharov
23-09-2020, 21:13
Попробуйте.

romfus
23-09-2020, 21:18
а как этот шаг добавить? chcp не помогает

DJ Mogarych
23-09-2020, 22:06
Powershell

$path = 'c:\temp\file.ini'
$ini = gc "$path" -Encoding oem

$ini -replace 'PostMark=536871936','PostMark=1024' `
-replace 'DocVersion=RTM0099','DocVersion=RTM003-13-17' |
Set-Content "$path" -Encoding oem

Iska
23-09-2020, 23:22
romfus, упакуйте Ваш ini-файл в архив, каковой приложите к сообщению.

romfus
24-09-2020, 08:09
Секунду

romfus
24-09-2020, 08:12
Прикрепил

DJ Mogarych
24-09-2020, 12:24
Ну, мой скрипт корректно работает.

greg zakharov
24-09-2020, 17:17
Ну, мой скрипт корректно работает.
То же могу сказать и про своё решение. Отличие лишь в том, что в PowerShell проще с кодировками, а в cmd нужно танцевать с бубном (чего делать не хочется). Проще PowerShell будет разве что sed:
sed -i "/postmark/Is/^\(.*=\)\(.*\)/\11024/;/docversion/Is/^\(.*=rtm00\)\(.*\)/\13-13-17/Ig" input.ini
А ещё проще задача решается на Q:
q "replace ig '^[postm,docve]*=,', [1024, 'RTM003-13-17']" < inpit.ini
И это также будет работать.

romfus
25-09-2020, 09:45
Проблема в том что с помощью вашего скрипта, внутри ini файла все задваивается. Как будто он не только изменяет эти значения а еще и объединяет файлы в один или просто копируется все много раз. Попробовал с 1 файлом все получилось. Попробовал с множеством файлов все задвоилось внутри ini

Попробуйте ini файл скопировать, чтобы было 2 файла и скриптом выполнить. Получится задвоение внутри ini. По одному делает. Когда несколько делает но задваивает




© OSzone.net 2001-2012