Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Найти текст по маске в файле и вставить найденные значения в ini файл (http://forum.oszone.net/showthread.php?t=338619)

Anidzuka 09-01-2019 00:25 2850664

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

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 2850667

Цитата:

Цитата Anidzuka
Нужно из файла с таким текстом: »

Упакуйте файл в архив и приложите к сообщению. Чем создаётся этот файл?

Цитата:

Цитата Anidzuka
сохранить их в ini файл последними строками »

Цитата:

Цитата Anidzuka
если с точной нумерацией строк проще можно сохранить в 45-46 строке »

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

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

Anidzuka 09-01-2019 01:11 2850671

Вложений: 1
файл создает "ChangeScreenResolution" ini файл слегка нестандартный он не имеет разделов вообще, только параметр и значения , в этом большой геморрой....
в прицепе главное что бы работало((

Anidzuka 09-01-2019 02:01 2850676

Извиняюсь, если вам не трудно можно еще как то сделать такое, что бы из 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 2850714

Тогда выкладывайте и образец Вашего как-бы ini-файла.

Цитата:

Цитата Anidzuka
если вам не трудно можно еще как то сделать такое, »

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

Anidzuka 09-01-2019 03:55 2850720

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

Iska 09-01-2019 05:34 2850722

Цитата:

Цитата Anidzuka
Кстати только что узнал что "AutoPlay Media Studio" умеет определять разрешения экрана, и записать эти данные тоже можно куда угодно... а вот с ини файлом и удалением строк »

Странно, что Вы тогда не нашли там же класс INIFile ;). Не факт, что он будет работать без имени секции, но проверить можно было бы (и также, можно попробовать проверить, будет ли работать с пустым именем секции Ваше приложение).

Цитата:

Цитата Anidzuka
и проверкой нумерации вопрос открыт....((. »

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

alpap 09-01-2019 14:53 2850880

Цитата:

Цитата 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 файла, это как набор переменных, т.е. они или есть и при этом определены или нет или их нет, порядок совершенно неважен.

Anidzuka 09-01-2019 19:11 2850954

Цитата:

Цитата Iska
Странно, что Вы тогда не нашли там же класс 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




Цитата:

Цитата alpap
Цитата 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 2851011

Цитата:

Цитата Anidzuka
жалуется на отсутствие файла »

запускать рядом с SADXModLoader.ini или указать полный путь к нему в строках 3 и 14, если есть пробелы взять путь в парные кавычки.

Цитата:

Цитата Anidzuka
крайне чувствительна к любым лишним разделам или нарушению нумерации списка, сразу выдает ошибку »

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

Anidzuka 09-01-2019 23:23 2851015

Вложений: 1
Цитата:

Цитата alpap
запускать рядом с SADXModLoader.ini или указать полный путь к нему в строках 3 и 14, если есть пробелы взять путь в парные кавычки. »

ни как не хочет

megaloman 09-01-2019 23:25 2851017

можно еще как то сделать такое, что бы из ini файла удалялась строка или строки с определённым значением , потом заново нумеровало параметры чтобы не было пропусков
Код:

@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
Цитата:

Цитата Anidzuka
вытянуть значения разрешения экрана дисплея 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 2851022

Вложений: 1
Цитата:

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

да нет дела как раз в том что если удалить строку то не будет ключа 18,20 видит что нет параметра 19 но есть 20 , всё ошибка, если просто убрать значение тоже ошибка и оставить "mod**=" ошибка , вот и получается что после удаление нужно заново пронумировать Mod**

alpap 09-01-2019 23:54 2851026

а так все-таки?
Код:

@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 2851027

Цитата:

Цитата megaloman
В представленном образце ini-файла эти строки первые. Или это другой ini-файл? Или надо убить эти строки и записать новые в конец? »

файл тот, просто этих строк изначально не будет ))) просто супер , все как часики работает )))) Хорошо когда мозги в голове есть всё так красиво и просто сделано , красота а не работа ))) Спасибо)))

Цитата:

Цитата alpap
а так все-таки? »

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

alpap 10-01-2019 00:03 2851030

и еще я никак не пойму, если было
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 2851034

Цитата:

Цитата alpap
и еще я никак не пойму, если было »

под каким номером значение вписке приложению без разницы ) а вот отсутствия номера уже ошибка

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

Anidzuka 10-01-2019 01:13 2851056

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

alpap 10-01-2019 13:47 2851151

Цитата:

Цитата Anidzuka
но и текста тоже »

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

megaloman 10-01-2019 17:13 2851222

добавление параметра мод с определённым значением так чтобы добавление происходило только если данного значения нет

Код:

@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


Anidzuka 10-01-2019 19:06 2851254

Цитата:

Цитата megaloman
добавление параметра мод с определённым значением так чтобы добавление происходило только если данного значения нет »

Вы просто гений, спасибище вам большое ))))
Класс с березкой ))) и снова всё идеально


Время: 02:05.

Время: 02:05.
© OSzone.net 2001-