Войти

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


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

Anidzuka
09-01-2019, 00:25
Приветствую, пожалуйста помогите(((
Нужно из файла с таким текстом:
Connected display devices:
[0] \\.\DISPLAY1 NVIDIA GeForce GTX 1070
\\.\DISPLAY1\Monitor0 Generic PnP Monitor
Settings: 2560x1080 32bit @60Hz default

[1] \\.\DISPLAY2 NVIDIA GeForce GTX 1070
\\.\DISPLAY2\Monitor0 Generic PnP Monitor
Settings: 1920x1080 32bit @60Hz default

[2] \\.\DISPLAY3 NVIDIA GeForce GTX 1070
[3] \\.\DISPLAY4 NVIDIA GeForce GTX 1070

вытянуть значения разрешения экрана дисплея 1 и сохранить их в ini файл последними строками в виде
HorizontalResolution=2560
VerticalResolution=1080
если с точной нумерацией строк проще можно сохранить в 45-46 строке

Iska
09-01-2019, 00:43
Нужно из файла с таким текстом: »
Упакуйте файл в архив и приложите к сообщению. Чем создаётся этот файл?

сохранить их в ini файл последними строками »
если с точной нумерацией строк проще можно сохранить в 45-46 строке »
Вообще-то, в ini-файле нет понятия номера строки. Есть понятия «раздел», «параметр», «значение параметра».

Насколько принципиальна реализация сего именно в рамках пакетных файлов?

Anidzuka
09-01-2019, 01:11
файл создает "ChangeScreenResolution" ini файл слегка нестандартный он не имеет разделов вообще, только параметр и значения , в этом большой геморрой....
в прицепе главное что бы работало((

Anidzuka
09-01-2019, 02:01
Извиняюсь, если вам не трудно можно еще как то сделать такое, что бы из ini файла удалялась строка или строки с определённым значением , потом заново нумеровало параметры чтобы не было пропусков ?

Mod1=
Mod2=
Mod3=
Mod4=
Mod5=
Mod6=
Mod7=
Mod8=
Mod9=
Mod10=
Mod11=
Mod12=
Mod13=
Mod14=
Mod15=
Mod16=
Mod17=
Mod18=
Mod19=

Iska
09-01-2019, 03:11
Тогда выкладывайте и образец Вашего как-бы ini-файла.

если вам не трудно можно еще как то сделать такое, »
Лениво. Коллеги, возможно, помогут. На пакетных файлах такое делать — то ещё удовольствие.

Anidzuka
09-01-2019, 03:55
не мой ini файл)) просто хочу сделать лаунчер к одной игре что бы в нём можно было выбрать между оригиналом и версии с модоми ,
так же вид перевода из трёх вариантов выбрать , и чтобы это можно было переключать как захочется , но вот заглох с файлом этим,
осталось только то сделать чтобы 3 мода отрубались при выборе русской версии , врубались обратно на английской, ну естественно что бы
перед первым запуском мод версии, разрешение экрана само установилось по дефолту системы... и так по мелочи нарисовать кнопки, сообщения дописать....
Вообще не думал что так много всего понадобиться когда решил , "неплохо бы сделать лаунчер"
Кстати только что узнал что "AutoPlay Media Studio" умеет определять разрешения экрана, и записать эти данные тоже можно куда угодно... а вот с ини файлом и удалением строк и проверкой нумерации вопрос открыт....((.

Iska
09-01-2019, 05:34
Кстати только что узнал что "AutoPlay Media Studio" умеет определять разрешения экрана, и записать эти данные тоже можно куда угодно... а вот с ини файлом и удалением строк »
Странно, что Вы тогда не нашли там же класс INIFile ;). Не факт, что он будет работать без имени секции, но проверить можно было бы (и также, можно попробовать проверить, будет ли работать с пустым именем секции Ваше приложение).

и проверкой нумерации вопрос открыт....((. »
Lua, конечно, достаточно специфичный язык (по сравнению хоть с классическими ЯВУ типа Basic/Fortran/Pascal/C, хоть с новомодными Java/Python/Ruby), но писать на нём можно.

alpap
09-01-2019, 14:53
разрешение экрана само установилось по дефолту системы »

@echo off
for /f "delims=" %%a in ('wmic path "win32_desktopmonitor" get ScreenHeight^,ScreenWidth /value^|find "="') do set "%%a"
<SADXModLoader.ini>$ (for /f "delims=" %%a in ('more') do @(
echo %%a|>nul find "HorizontalResolution" && (
echo HorizontalResolution=%ScreenWidth%
) || (
echo %%a|>nul find "VerticalResolution" && (
echo VerticalResolution=%ScreenHeight%
) || (
echo %%a
)
)
)
)& >nul move $ SADXModLoader.ini
pause


по поводу:
что бы из ini файла удалялась строка или строки с определённым значением , потом заново нумеровало параметры чтобы не было пропусков »
не понял, какая разница по порядку или нет для ini файла, это как набор переменных, т.е. они или есть и при этом определены или нет или их нет, порядок совершенно неважен.

Anidzuka
09-01-2019, 19:11
Странно, что Вы тогда не нашли там же класс INIFile . Не факт, что он будет работать без имени секции, но проверить можно было бы (и также, можно попробовать проверить, будет ли работать с пустым именем секции Ваше приложение). »
Ну программа это громко сказано, просто менюшка которая запускает , батники и архивы с нужными файлами/ при определённых условиях и запивает что изменилось в ини файл )) побывал без секции команда не работает
в каждой кнопке вот такой шаблон
-------------------------------------------------------------
--СПИСОК ПЕРЕМЕННЫХ------
-------------------------------------------------------------
SMT = INIFile.GetValue("Mode.ini", "STEAM_MODE", "Txt");
MMT = INIFile.GetValue("Mode.ini", "MOD_MODE", "Txt");
MML = INIFile.GetValue("Mode.ini", "MODE", "Launcher");
MMO = INIFile.GetValue("Mode.ini", "MODE", "OnlyTXT");
MSS = INIFile.GetValue("Mode.ini", "STEAM_MODE", "Sound");
MMS = INIFile.GetValue("Mode.ini", "MOD_MODE", "Sound");
--- RMOD = File.Run("AutoPlay\\run_mod.bat", "", _SourceFolder, SW_HIDE, true);
--- RSTM = File.Run("AutoPlay\\run_steam.bat", "", _SourceFolder, SW_HIDE, true);
--- MENS = File.Run("AutoPlay\\en_sound.exe", "", "system", SW_SHOWNORMAL, true);
--- SENS = File.Run("AutoPlay\\en_sound.exe", "", _SourceFolder, SW_SHOWNORMAL, true);
--- MRUS = File.Run("AutoPlay\\rus_sound.exe", "", "system", SW_SHOWNORMAL, true);
--- SRUS = File.Run("AutoPlay\\rus_sound.exe", "", _SourceFolder, SW_SHOWNORMAL, true);
--- MFIX = File.Run("AutoPlay\\mod.exe", "", _SourceFolder, SW_HIDE, true);
--- SFIX = File.Run("AutoPlay\\steam.exe", "", _SourceFolder, SW_HIDE, true);
--- RTXT = File.Run("AutoPlay\\rus_txt.exe", "", _SourceFolder, SW_HIDE, true);
--- ETXT = File.Run("AutoPlay\\en_txt.exe", "", _SourceFolder, SW_HIDE, true);
--- FTXTEN = File.Run("AutoPlay\\en_txt_fix.exe", "", _SourceFolder, SW_HIDE, true);
--- FTXTRU = File.Run("AutoPlay\\rus_txt_fix.exe", "", _SourceFolder, SW_HIDE, true);

-------------------------------------------------------------
-----------------------------------------------------
----Действия------
-----------------------------------------------------
--- Английскя steam-версия
if MML == "steam" and SMT == "EN" and MSS == "EN" then
Paragraph.SetText("Paragraph1",SteamEN);
end

--- Русская steam-версия, голос и текст
if MML == "steam" and SMT == "RU" and MSS == "RU" then
Paragraph.SetText("Paragraph1",SteamRU);
end

--- Русская steam-версия с английской озвучкой
if MML == "steam" and SMT == "RU" and MSS == "EN" then
Paragraph.SetText("Paragraph1",SteamRUT);
end

--- Английскя BetterSADX-версия
if MML == "mod" and MMT == "EN" and MMS == "EN" then
RSTM = File.Run("AutoPlay\\run_steam.bat", "", _SourceFolder, SW_HIDE, true);
SFIX = File.Run("AutoPlay\\steam.exe", "", _SourceFolder, SW_HIDE, true);
--------------------------------------------------------------------
--проверка
if MSS == "RU" then
SENS = File.Run("AutoPlay\\en_sound.exe", "", _SourceFolder, SW_SHOWNORMAL, true);
ETXT = File.Run("AutoPlay\\en_txt.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "EN");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "EN");
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
else
FTXTEN = File.Run("AutoPlay\\en_txt_fix.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "EN");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "EN");
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
end
end


--- Русская BetterSADX-версия, голос и текст
if MML == "mod" and MMT == "RU" and MMS == "RU" then
RSTM = File.Run("AutoPlay\\run_steam.bat", "", _SourceFolder, SW_HIDE, true);
SFIX = File.Run("AutoPlay\\steam.exe", "", _SourceFolder, SW_HIDE, true);
--------------------------------------------------------------------
--проверка
if MSS == "EN" then
SRUS = File.Run("AutoPlay\\rus_sound.exe", "", _SourceFolder, SW_SHOWNORMAL, true);
RTXT = File.Run("AutoPlay\\rus_txt.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "RU");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "RU");
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
else
FTXTRU = File.Run("AutoPlay\\rus_txt_fix.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "RU");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "RU")
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
end
end

--- Русская BetterSADX-версия с английской озвучкой
if MML == "mod" and MMT == "RU" and MMS == "EN" then
RSTM = File.Run("AutoPlay\\run_steam.bat", "", _SourceFolder, SW_HIDE, true);
SFIX = File.Run("AutoPlay\\steam.exe", "", _SourceFolder, SW_HIDE, true);
--------------------------------------------------------------------
--проверка
if MSS == "EN" then
RTXT = File.Run("AutoPlay\\rus_txt.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "RU");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "EN");
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
else
SENS = File.Run("AutoPlay\\en_sound.exe", "", _SourceFolder, SW_SHOWNORMAL, true);
FTXTRU = File.Run("AutoPlay\\rus_txt_fix.exe", "", _SourceFolder, SW_HIDE, true);
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Txt", "RU");
INIFile.SetValue("Mode.ini", "STEAM_MODE", "Sound", "EN")
INIFile.SetValue("Mode.ini", "MODE", "Launcher", "steam");
end
end



Цитата Anidzuka:
разрешение экрана само установилось по дефолту системы »
Код:
@echo off
for /f "delims=" %%a in ('wmic path "win32_desktopmonitor" get ScreenHeight^,ScreenWidth /value^|find "="') do set "%%a"
<SADXModLoader.ini>$ (for /f "delims=" %%a in ('more') do @(
echo %%a|>nul find "HorizontalResolution" && (
echo HorizontalResolution=%ScreenWidth%
) || (
echo %%a|>nul find "VerticalResolution" && (
echo VerticalResolution=%ScreenHeight%
) || (
echo %%a
)
)
)
)& >nul move $ SADXModLoader.ini
pause
по поводу:
Цитата Anidzuka:
что бы из ini файла удалялась строка или строки с определённым значением , потом заново нумеровало параметры чтобы не было пропусков »
не понял, какая разница по порядку или нет для ini файла, это как набор переменных, т.е. они или есть и при этом определены или нет или их нет, порядок совершенно неважен. »
Круто, но почему то жалуется на отсутствие файла.
Так проблема в том что это INI сторонней программы которая крайне чувствительна к любым лишним разделам или нарушению нумерации списка, сразу выдает ошибку , этот ini походу только притворяется ini )))

alpap
09-01-2019, 23:11
жалуется на отсутствие файла »
запускать рядом с SADXModLoader.ini или указать полный путь к нему в строках 3 и 14, если есть пробелы взять путь в парные кавычки.

крайне чувствительна к любым лишним разделам или нарушению нумерации списка, сразу выдает ошибку »
вероятно ваши изменения в ini затрагивают его кодировку, ну никак изменение чередования строк не должны влиять на работоспособность, только изменения в строках ну и их добавление или отсутствие. Интересно бы проверить, но это же все также надо поустанавливать.

Anidzuka
09-01-2019, 23:23
запускать рядом с SADXModLoader.ini или указать полный путь к нему в строках 3 и 14, если есть пробелы взять путь в парные кавычки. »
ни как не хочет

megaloman
09-01-2019, 23:25
@Echo Off
Set "FileIni=Z:\Soft_In\SADXModLoader.ini"
Set "Key=Mod"
Set "Val="Perfect Chaos Music Swap" "sadx-frame-limit" "EggCarrierOceanMusic""

Set /A M=0
Move /Y "%FileIni%" "%FileIni%.bak" >nul
>"%FileIni%" (FOR /F "usebackq tokens=1* delims==" %%i IN ("%FileIni%.bak") DO Set "S=%%i" &Call :OutAll "%%i" "%%j" %%S:%Key%=%%)
GoTo :Eof

:OutAll
Set /A N=0
Set /A N=%3 2>nul
If %N% GTR 0 If %1=="%Key%%N%" Call :Out1 %2 &GoTo :Eof
(Echo %~1=%~2)
GoTo :Eof

:Out1
Set "Value=%~1"
For %%a IN (%Val%) DO Call Set "Value=%%Value:%%~a=%%"
If Not %1=="%Value%" GoTo :Eof
Set /A M+=1
(Echo %Key%%M%=%~1)
GoTo :Eof
Список строк со значением параметров, которые надо убить, в переменной Valвытянуть значения разрешения экрана дисплея 1 и сохранить их в ini файл последними строками в виде
HorizontalResolution=2560
VerticalResolution=1080 »В представленном образце ini-файла эти строки первые. Или это другой ini-файл? Или надо убить эти строки и записать новые в конец?@Echo Off
Set "FileRes=Z:\Soft_In\Res.txt"
Set "FileIni=Z:\Soft_In\SADXModLoader.ini"
Set "Res=Settings"

>>"%FileIni%" (FOR /F "usebackq tokens=1,2,3 delims=:x " %%i IN ("%FileRes%") DO If "%%i"=="%Res%" (
(Echo HorizontalResolution=%%j)
(Echo VerticalResolution=%%k)
GoTo :Continue
))
:Continue
GoTo :Eof

Anidzuka
09-01-2019, 23:40
вероятно ваши изменения в ini затрагивают его кодировку, ну никак изменение чередования строк не должны влиять на работоспособность, только изменения в строках ну и их добавление или отсутствие. Интересно бы проверить, но это же все также надо поустанавливать. »
да нет дела как раз в том что если удалить строку то не будет ключа 18,20 видит что нет параметра 19 но есть 20 , всё ошибка, если просто убрать значение тоже ошибка и оставить "mod**=" ошибка , вот и получается что после удаление нужно заново пронумировать Mod**

alpap
09-01-2019, 23:54
а так все-таки?

@echo off
set "f=Диск:\Папка\SADXModLoader.ini"
set "H=HorizontalResolution"
set "V=VerticalResolution"

for /f "delims=" %%a in ('wmic path "win32_desktopmonitor" get ScreenHeight^,ScreenWidth /value^|find "="') do set "%%a"
<"%f%">$ (for /f "delims=" %%a in ('more') do @(
echo %%a|>nul find "%H%" && echo %H%=%ScreenWidth%
echo %%a|>nul find "%V%" && echo %V%=%ScreenHeight%
echo %%a|>nul findstr /v /c:"%H%" /c:"%V%" && echo %%a
)
)& >nul move $ "%f%"
pause


Здесь путь настоящий укажите: set "f=Диск:\Папка\SADXModLoader.ini"

Anidzuka
09-01-2019, 23:55
В представленном образце ini-файла эти строки первые. Или это другой ini-файл? Или надо убить эти строки и записать новые в конец? »
файл тот, просто этих строк изначально не будет ))) просто супер , все как часики работает )))) Хорошо когда мозги в голове есть всё так красиво и просто сделано , красота а не работа ))) Спасибо)))

а так все-таки? »
ошибки нет, но и текста тоже, а он с 64x работает?

alpap
10-01-2019, 00:03
и еще я никак не пойму, если было
Mod16=smooth-cam
Mod17=SoundOverhaul
Mod18=SteamAchievements
Mod19=super-sonic
Mod20=DLCs

и станет с изменением по порядку
Mod16=smooth-cam
Mod17=SoundOverhaul
Mod18=super-sonic
Mod19=DLCs

то сразу видно что теперь
значение 'super-sonic' уже имеет Mod18 а не Mod19
и далее все аналогично сбивается (смещается), а это уже точно неправильно, не?

Anidzuka
10-01-2019, 00:10
и еще я никак не пойму, если было »
под каким номером значение вписке приложению без разницы ) а вот отсутствия номера уже ошибка

Спасибо, узнал столько нового, вы все просто СУПЕРРРРРР

Anidzuka
10-01-2019, 01:13
megaloman, только что понял что значения и обратно нужно будет вставить ((( дико извиняюсь, а можно точно такой же как и с удалением , но только добавление параметра мод с определённым значением ? если возможно сделать так чтобы добавление происходило только если данного значения нет ( простите((

alpap
10-01-2019, 13:47
но и текста тоже »
какого... текста вы ждете. Изменения сразу (записываются) происходят в ini, вероятно у вас в искомых строках как раз и записаны ваши дефолтные размеры и не видно изменений. Попробуйте самостоятельно изменить значения на что угодно, а потом запустить код и размеры станут в нужных строках этой машины.

megaloman
10-01-2019, 17:13
@Echo Off
cls
Set "FileIni=Z:\Soft_In\SADXModLoader.ini"
Set "Key=Mod"
Set "Add="Во поле" "Perfect Chaos Music Swap" "Люли люли" "sadx-frame-limit" "Берёзонька стояла" "EggCarrierOceanMusic""

Set /A N=1000
Set "Pref=A"
FOR /F "usebackq tokens=1* delims==" %%i IN ("%FileIni%") DO Call :In "%%i" "%%j"

Set /A N=1000
FOR %%i IN (%Add%) DO Set /A N+=1 &Call Set "Z@@%%N%%=%%~i"

FOR /F "usebackq tokens=3 delims==" %%i IN (`Set "B@@"`) DO (
FOR /F "usebackq tokens=1,2 delims==" %%a IN (`Set "Z@@"`) DO If /I "%%~i"=="%%~b" Set "%%~a="
)

Set /A N=9000
FOR /F "usebackq tokens=1,2 delims==" %%a IN (`Set "Z@@"`) DO Set /A N+=1 &Call Set "B@@%%N%%=%Key%99=%%~b"

Move /Y "%FileIni%" "%FileIni%.bak" >nul

Set /A N=0
>"%FileIni%" (
FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "A@@"`) DO Echo %%j
FOR /F "usebackq tokens=3 delims==" %%i IN (`Set "B@@"`) DO Set /A N+=1 &Call Echo %Key%%%N%%=%%i
FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "C@@"`) DO Echo %%j
)
pause
GoTo :Eof

:In
Set /A N+=1
Set /A M=0
Set "InKey=%~1"
Call Set "InKey=%%InKey:%Key%=%%"
Set /A M=%InKey% 2>nul
If %Pref%==B If "%M%"=="0" Set "Pref=C"
If %1=="%Key%1" Set "Pref=B"
Set "%Pref%@@%N%=%~1=%~2"
GoTo :Eof




© OSzone.net 2001-2012