Показать полную графическую версию : [решено] Изменение текста в ini файлах
Добрый день. Имеются ini файлы, все они лежат в одном месте (Пусть будет D:\test).
Как можно с помощью скрипта изменить сразу несколько строк во всех ini файлах?
Нужно поменять PostMark=536871936 на PostMark=1024 и DocVersion=RTM0099 на DocVersion=RTM003-13-17
greg zakharov
23-09-2020, 14:52
romfus, приведите пример ini.
Текст 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
Что - то вот такое получается
[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
Скорее всего дело в кодировке.
Нужно скинуть ini файл? Или как то можно кодировку прописать в скрипте?
greg zakharov
23-09-2020, 16:37
У вас ini в какой кодировке?
greg zakharov
23-09-2020, 17:05
Попробуйте "прогнать" сценарий на каком-нибудь одном файле, т.е. строчку for /r D:\test %%i in (*.ini) do call:patch "%%i" замените на call:patch D:\test\имя_существующего_файла.ini
call:patch D:\test\имя_существующего_файла.ini »
тоже самое
может к скрипту добавить шаг с перекодировкой?
greg zakharov
23-09-2020, 21:13
Попробуйте.
а как этот шаг добавить? 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
romfus, упакуйте Ваш ini-файл в архив, каковой приложите к сообщению.
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
И это также будет работать.
Проблема в том что с помощью вашего скрипта, внутри ini файла все задваивается. Как будто он не только изменяет эти значения а еще и объединяет файлы в один или просто копируется все много раз. Попробовал с 1 файлом все получилось. Попробовал с множеством файлов все задвоилось внутри ini
Попробуйте ini файл скопировать, чтобы было 2 файла и скриптом выполнить. Получится задвоение внутри ini. По одному делает. Когда несколько делает но задваивает
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.