|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Изменение метода поиска строк в конфиге |
|
CMD/BAT - Изменение метода поиска строк в конфиге
|
Stalker_AleX333
Сообщения: n/a |
Как бы мне вот это:
set "ControlPanelFilesListConfig=Silver Raven mods pack data\fileslist.cfg" set "ControlPanelFilesListMissingFiles=" :: Чтение конфиг-файла fileslist.cfg setlocal EnableDelayedExpansion for /f "tokens=1,2* delims==" %%A in ("%ControlPanelFilesListConfig%") do set "$%%A=%%B" :: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data for %%? in (%$ControlPanelFilesListConfig%) do ( if not exist "%%~?" set ControlPanelFilesListMissingFiles=!ControlPanelFilesListMissingFiles!, "%%~?" ) setlocal DisableDelayedExpansion if defined ControlPanelFilesListMissingFiles ( color fc echo. echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены: echo. echo. for %%A in (%ControlPanelFilesListMissingFiles%) do echo %%~A echo. echo. pause exit ) 1. в столбик 2. по такому шаблону [ControlPanelFilesList] Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.esp Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.bsa Silver Raven mods pack data\Additional options\Serana\Cured\00002b6c.nif Silver Raven mods pack data\Additional options\Serana\Vampire\00002b6c.nif и т.д. и т.п. [ДругойПараметр] бла-бла-бла |
|
Отправлено: 20:37, 03-07-2019 |
Забанен Сообщения: 793
|
Stalker_AleX333, лучше отказаться от идеи использовать для разборка конфигурационных файлов командные сценарии в пользу PowerShell и WinAPI.
|
Отправлено: 15:23, 04-07-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Stalker_AleX333
Сообщения: n/a |
greg zakharov, знаю, знаю. Уже даже тестовый черновик есть.
Скрытый текст
$scriptName = $MyInvocation.MyCommand.Name $scriptPath = split-path -parent $MyInvocation.MyCommand.Definition $exeName = "SkyrimSE.exe" $processName = $exeName.Substring(0, $exeName.LastIndexOf(".exe")) $modFolderName = "Silver Raven mods pack data" $listfileName = "fileslist.cfg" $soundconfigName = "hd_sounds_packages.cfg" $autoupconfigName = "autoupdate.cfg" $profileEnv = $ENV:UserProfile $maininiName = "$profileEnv\Documents\My Games\Skyrim Special Edition" $pluginsName = "$profileEnv\AppData\Local\Skyrim Special Edition" #FUNCTIONS #delete mod files function deleteFiles ($path) { #remove mod folder if(Test-Path -LiteralPath "$path\$modFolderName") { Remove-Item -LiteralPath "$path\$modFolderName" -Force -Recurse } #remove script if(Test-Path -LiteralPath "$path\run.ps1") { Remove-Item -LiteralPath "$path\run.ps1" -Force } } #show information about current version and statuses function printCurrentVersion () { #read sound config file $snd_searchParams = "HDSoundsPackagesStatus", "HDSoundsPackagesLocalizationStatus" $configFile = "$scriptPath\$modFolderName\$soundconfigName" $lines = Get-Content $configFile if(!$lines.Length) { Write-Host "File is empty: $configFile" return } #get lines from config file foreach($line in $lines) { foreach ($element in $snd_searchParams) { $res = $line -match $element if($res -eq $true) { Write-Host ($line -replace "="," ") break } } } #read auto config file $auto_searchParam = "ModsPackVersion" $configFile = "$scriptPath\$modFolderName\$autoupconfigName" $lines = Get-Content $configFile if(!$lines.Length) { Write-Host "File is empty: $configFile" return } foreach($line in $lines) { $res = $line -match $auto_searchParam if($res -eq $true) { Write-Host ($line -replace "="," ") break } } Write-Host "ENBVersion Нет данных" } #final actions for localization settings function finalizeLocalization ($modIniFile, $appIniFile, $configFile, $language) { #copy ini Copy-Item $modIniFile -Destination $appIniFile #add language status Add-Content $configFile "UpdateInstalled=$language" #update install status ((Get-Content -path $configFile) -replace 'HDSoundsPackagesStatus=Не установлен', 'HDSoundsPackagesStatus=Установлен') | Set-Content -Path $configFile } #process localization function checkLocalization ($configFile) { $k_HDSoundsPackagesStatus = "HDSoundsPackagesStatus" $k_HDSoundsPackagesENGLocalization = "HDSoundsPackagesENGLocalization" $k_HDSoundsPackagesRUSLocalization = "HDSoundsPackagesRUSLocalization" $k_HDSoundsPackagesENGRUSLocalization = "HDSoundsPackagesENGRUSLocalization" $k_HDSoundsPackagesLocalizationStatus = "HDSoundsPackagesLocalizationStatus" #read sound file $lines = Get-Content $configFile if(!$lines.Length) { Write-Host "File is empty: $configFile" return } #get lines from config file $soundParams = @{} foreach($line in $lines) { #get values $pos = $line.IndexOf("=") if($pos -eq -1) { continue } $k = $line.Substring(0, $pos) $v = $line.Substring(($pos + 1), ($line.Length - $pos - 1)) $soundParams.$k = $v } if($soundParams.$k_HDSoundsPackagesStatus -eq "Не установлен") { Write-Host "Sound packages not installed" #check that both ru and eng files exist $filesOK = $true $files = $soundParams.$k_HDSoundsPackagesENGRUSLocalization.Split(",") foreach($file in $files) { $file = $file.trim(" ") if(!(Test-Path -LiteralPath "$scriptPath\$file")) { Write-Host "Sound file: $scriptPath\$file not exist" $filesOK = $false break } } if($filesOK -eq $true) { #do something Write-Host "All sound packages existed" $soundParams.Clear() #select sound package Write-Host -NoNewLine 'Select sound package(1 - eng, 2 - rus)[1]:' $answer = $Host.UI.RawUI.ReadKey() $key = $answer.Character $iniFilename = "" $language = "" switch($key) { "1" { Write-Host "`nEnglish selected" $iniFilename = "$scriptPath\$modFolderName\INI settings\Skyrim_eng.ini" $language = "Английский" break } "2" { Write-Host "`nRussian selected" $iniFilename = "$scriptPath\$modFolderName\INI settings\Skyrim_rus.ini" $language = "Русский" break } default { Write-Host "`nEnglish selected (default)" $iniFilename = "$scriptPath\$modFolderName\INI settings\Skyrim_eng.ini" $language = "Английский" break } } finalizeLocalization $iniFilename "$maininiName\Skyrim.ini" $configFile $language return } #check that eng files exist $filesOK = false $files = $soundParams.$k_HDSoundsPackagesENGLocalization.Split(",") foreach($file in $files) { $file = $file.trim(" ") if(!(Test-Path -LiteralPath "$scriptPath\$file")) { Write-Host "Sound file: $scriptPath\$file not exist" $filesOK = $false break } } if($filesOK -eq $true) { #do something Write-Host "Eng sound packages existed" $soundParams.Clear() finalizeLocalization $iniFilename "$maininiName\Skyrim.ini" $configFile $language return } #check that rus files exist $filesOK = false $files = $soundParams.$k_HDSoundsPackagesRUSLocalization.Split(",") foreach($file in $files) { $file = $file.trim(" ") if(!(Test-Path -LiteralPath "$scriptPath\$file")) { Write-Host "Sound file: $scriptPath\$file not exist" $filesOK = $false break } } if($filesOK -eq $true) { Write-Host "Rus sound packages existed" $soundParams.Clear() finalizeLocalization $iniFilename "$maininiName\Skyrim.ini" $configFile $language return } Write-Host "No language selected" } Write-Host "Sound packages alredy installed" } #process autoconfig function checkAutoupdate ($configFile) { $k_UpdateInstalled = "UpdateInstalled" $k_ModsPackVersion = "ModsPackVersion" $k_AutoUpdateFoldersForDelete = "AutoUpdateFoldersForDelete" $k_AutoUpdateFilesForDelete = "AutoUpdateFilesForDelete" $k_AutoUpdateRenameFoldersAndFiles = "AutoUpdateRenameFoldersAndFiles" $k_AutoUpdateMoveFoldersAndFiles = "AutoUpdateMoveFoldersAndFiles" #read config file $lines = Get-Content $configFile if(!$lines.Length) { Write-Host "File is empty: $configFile" return } #get lines from config file $autoupParams = @{} foreach($line in $lines) { #skip rem lines $pos = $line.IndexOf(";") if($pos -ne -1) { continue } #get values $pos = $line.IndexOf("=") if($pos -eq -1) { continue } $k = $line.Substring(0, $pos) $v = $line.Substring(($pos + 1), ($line.Length - $pos - 1)) $autoupParams.$k = $v } if($autoupParams.$k_UpdateInstalled -eq $null) { Write-Host "Corrupted config file: UpdateInstalled parameter no found" return } if($autoupParams.$k_ModsPackVersion -eq $null) { Write-Host "Corrupted config file: ModsPackVersion parameter no found" return } if($autoupParams.$k_AutoUpdateFoldersForDelete -ne $null) { Write-Host "process AutoUpdateFoldersForDelete" #do something } if($autoupParams.$k_AutoUpdateFilesForDelete -ne $null) { Write-Host "process AutoUpdateFilesForDelete" #do something } if($autoupParams.$k_AutoUpdateRenameFoldersAndFiles -ne $null) { Write-Host "process AutoUpdateRenameFoldersAndFiles" #do something } if($autoupParams.$k_AutoUpdateFoldersForDelete -ne $null) { Write-Host "process AutoUpdateMoveFoldersAndFiles" #do something } #set status in config ((Get-Content -path $configFile) -replace 'UpdateInstalled=false', 'UpdateInstalled=true') | Set-Content -Path $configFile } #process plugins and settings function copyPluginsAndSettings () { $prefsName = "$maininiName\SkyrimPrefs.ini" $pluginsSrcName = "$scriptPath\$modFolderName\Plugins list\Plugins.txt" $refSettings = @{} $refSettings.bDrawLandShadows = "1" $refSettings.bFXAAEnabled = "0" $refSettings.bEnableImprovedSnow = "0" $refSettings.bShadowsOnGrass = "1" $refSettings.fTreesMidLODSwitchDist = "12288.0000" $refSettings.fMeshLODLevel2FadeTreeDistance = "6144.0000" $refSettings.fMeshLODLevel1FadeTreeDistance = "8192.0000" $refSettings.fSkyCellRefFadeDistance = "295000.0000" $refSettings.iWaterReflectHeight = "1024" $refSettings.iWaterReflectWidth = "1024" $refSettings.uiMaxSkinnedTreesToRender = "200" #check that perf file exist if(!(Test-Path -LiteralPath $prefsName)) { Write-Host "Config file not found: $prefsName" return } else { #read perf file $content = Get-Content $prefsName if(!$content.Length) { Write-Host "File is empty: $prefsName" return } #replace values in config foreach($line in $content) { foreach ($h in $refSettings.GetEnumerator()) { $key = $h.Name $replaceString = $h.Name + "=" + $h.Value $res = $line -match $key if($res -eq $true) { $content = $content.replace($line, $replaceString) break } } } $content | Set-Content $prefsName } #if plugins file exist process it if(Test-Path -LiteralPath $pluginsSrcName) { Write-Host "Plugins file found. Copy it" Copy-Item $pluginsSrcName -Destination "$pluginsName" } } #MENUS function menuLocalizationAndMusic () { Write-Host -NoNewLine 'Select action (1 - Download localization, 2 - Select localization)[2]:' $answer = $Host.UI.RawUI.ReadKey() $key = $answer.Character switch($key) { "1" { Write-Host "`nDownload localization selected" #code not ready break } "2" { Write-Host "`nSelect localization selected" break } default { Write-Host "`nSelect localization selected (default)" break } } } function menuLocalizationActication () { Write-Host -NoNewLine 'Select sound package (1 - eng, 2 - rus, 0 - back)[0]:' $answer = $Host.UI.RawUI.ReadKey() $key = $answer.Character switch($key) { "1" { Write-Host "`nEnglish selected" #some code break } "2" { Write-Host "`nRussia selected" #some code break } "0" { menuLocalizationAndMusic } default { menuLocalizationAndMusic } } } function menuSelectUpdateSource () { Write-Host -NoNewLine 'Select download source (1 - Gamer-Mods.ru, 2 - ЯндексДиск, 3 - GoogleDrive, 0 - back)[0]:' $answer = $Host.UI.RawUI.ReadKey() $key = $answer.Character switch($key) { "1" { Write-Host "`nGamer-Mods.ru selected" start https://gamer-mods.ru/load/skyrim_se/grafika/silver_raven_mods_pack/152-1-0-5368 break } "2" { Write-Host "`nЯндексДиск selected" start https://yadi.sk/d/qyJbvZs43Mb3fR break } "3" { Write-Host "`nGoogleDrive selected" start https://drive.google.com/drive/folders/0B8H6Ge9z3EyEN3l5QWJpQXJuSmc?usp=sharing #some code break } default { #back break } } } function menuMain () { Write-Host -NoNewLine 'Select download source (1 - copy plugins, 2 - hd packages, 3 - update, 4 - loot, 5 - info, 6 - delete, 0 - exit)[0]:' $answer = $Host.UI.RawUI.ReadKey() $key = $answer.Character switch($key) { "1" { Write-Host "`nCopy plugins selected" break } "2" { Write-Host "`nHD packages selected" break } "3" { Write-Host "`nUpdate selected" break } "4" { Write-Host "`nLoot selected" break } "5" { Write-Host "`nInfo selected" break } "6" { Write-Host "`nDelete selected" break } default { return } } } #MAIN BODY #check that exe file in same folder if(!(Test-Path -LiteralPath "$scriptPath\$exeName")) { Write-Host "Executable file not found: $scriptPath\$exeName" return } #check that game is not running $processActive = Get-Process $processName -ErrorAction SilentlyContinue if($processActive -ne $null) { Write-Host "Process is active: $processName" return } #check mod folder with list file exist if(!(Test-Path -LiteralPath "$scriptPath\$modFolderName\$listfileName")) { Write-Host "Mod folder not found: $scriptPath\$modFolderName\$listfileName" return } #check that list file not empty $lines = Get-Content "$scriptPath\$modFolderName\$listfileName"; if(!$lines.Length) { Write-Host "File is empty: $scriptPath\$modFolderName\$listfileName"; return } #check that each file exist foreach($line in $lines) { if(!(Test-Path -LiteralPath "$scriptPath\$line")) { Write-Host "File not found: $scriptPath\$line" return } } #test success! #checkLocalization "$scriptPath\$modFolderName\$soundconfigName" #test success! #checkAutoupdate "$scriptPath\$modFolderName\$autoupconfigName" #test success! #copyPluginsAndSettings #test success! #printCurrentVersion #test success! #deleteFiles "E:\temp3\CMD1" Write-Host "End!" Но работающий как надо вариант нужен был еще вчера... |
Отправлено: 21:40, 04-07-2019 | #3 |
Забанен Сообщения: 793
|
Stalker_AleX333, у вас .cfg файл по структуре похож на .ini, а потому проще, повторюсь, использовать WinAPI, конкретней - GetPrivateProfileString и иже с ним.
|
Отправлено: 20:36, 05-07-2019 | #4 |
Stalker_AleX333
Сообщения: n/a |
Не буду плодить однотипные темы, подниму эту.
Вот почему-то перестал работать вот этот кусок. Глаза уже "замылились", может я где-то испоганил? set "ControlPanelFilesListConfig=Silver Raven mods pack data\fileslist.cfg" set "ControlPanelFilesListMissingFiles=" :: Чтение конфиг-файла fileslist.cfg setlocal EnableDelayedExpansion for /f "tokens=1,2* delims==" %%A in ("%ControlPanelFilesListConfig%") do set "$%%A=%%B" :: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data for %%? in (%$ControlPanelFilesListConfig%) do ( if not exist "%%~?" set ControlPanelFilesListMissingFiles=!ControlPanelFilesListMissingFiles!, "%%~?" ) setlocal DisableDelayedExpansion if defined ControlPanelFilesListMissingFiles ( color fc echo. echo. echo. echo *ОШИБКА! Следующие файлы, необходимые для корректной работы программы, не найдены: echo. echo. for %%A in (%ControlPanelFilesListMissingFiles%) do echo %%~A echo. echo. echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу. echo. echo. pause exit ) fileslist.cfg
ControlPanelFilesList="Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.esp" "Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.bsa" "Silver Raven mods pack data\Additional options\Serana\Cured\00002b6c.nif" и т.д. З.Ы. Если что, это чудо должно сверять наличие файлов со списком в конфиге и в случае отсутствия чего-либо ругаться, выводя в столбик список отсутствующего. |
|
Отправлено: 22:19, 13-07-2019 | #5 |
Stalker_AleX333
Сообщения: n/a |
Для справки. В общем, дошел до этого:
call :read_control_panel_files_list_config "%ControlPanelFilesListConfig%" :: Проверка наличия всех файлов для панели управления в Silver Raven mods pack data setlocal EnableDelayedExpansion for %%? in (!$ControlPanelFilesList!) do ( if "" == "!!" endlocal if not exist "%%?" ( set File=%%? setlocal EnableDelayedExpansion for /f "delims=" %%A in ("!ControlPanelFilesListMissingFiles!, !File!") do ( endlocal set ControlPanelFilesListMissingFiles=%%A ) ) ) if defined %ControlPanelFilesListMissingFiles% ( color fc echo. echo. echo. echo *ОШИБКА! Нижеуказанные файлы, необходимые для корректной работы программы, не найдены: echo. echo. for /f "usebackq tokens=1* delims==" %%A in ("%ControlPanelFilesListConfig%") do ( for %%? in (%%B) do if not exist %%? set ControlPanelFilesListMissingFiles=1 && echo %%~? echo. echo. echo. echo *ОШИБКА! Вышеуказанные файлы, необходимые для корректной работы программы, не найдены. echo. echo Извлеките папку Silver Raven mods pack data из установочных архивов со сборкой в папку игры вручную и перезапустите панель управления. Убедитесь, что антивирусное ПО не блокирует ее работу. echo. echo. pause exit ) |
Отправлено: 18:08, 20-07-2019 | #6 |
Ветеран Сообщения: 2708
|
Профиль | Отправить PM | Цитировать Stalker_AleX333, Плохо, что приведён код (надо его изучать, чтобы понять смысл задачи), легче - когда поставлена задача.
Пытаюсь сформулировать: есть текстовый файл, например, Silver Raven mods pack data\fileslist.cfg, в котором, среди прочего, содержится список файлов в виде определённого параметра ControlPanelFilesList="Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.esp" "Silver Raven mods pack data\Additional options\Alternate Start\Alternate Start - Live Another Life.bsa" "Silver Raven mods pack data\Additional options\Serana\Cured\00002b6c.nif" и т.д. Вот вариант
@Echo Off cls Set "CFG=Silver Raven mods pack data\fileslist.cfg" Set "FileList=ControlPanelFilesList=" If Not Exist "%CFG%" (Echo !!! File "%CFG%" not found &Pause &Exit /B 2) Set /A N=100 Set /A Log=0 FOR /F "usebackq tokens=1* delims==" %%i IN (`FINDSTR /I "%FileList%" "%CFG%"`) DO ( Set /A Log=1 FOR %%f IN (%%j) DO If Not Exist %%f ( Set /A N+=1 Call Set "@@@%%N%%=%%f" ) ) If %Log%==0 (Echo !!! Parameter "%FileList%" not found in "%CFG%" &Pause &Exit /B 2) If Not %N%==100 ( Echo !!! Files not found FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@@"`) DO Echo %%j Pause Exit /B 2 ) Echo Здесь пишем остальной код pause Exit /B Если надо искать наличие файлов, перечисленных в разных параметрах, лучше это оформить в виде процедуры
@Echo Off cls Set "CFG=Silver Raven mods pack data\fileslist.cfg" Set /A N=100 Call :NoFiles "%CFG%" "ControlPanelFilesList=" ||Exit /B 2 Call :NoFiles "%CFG%" "TraLaLaFilesList=" ||Exit /B 2 If Not %N%==100 ( Echo !!! Files not found FOR /F "usebackq tokens=1* delims==" %%i IN (`Set "@@@"`) DO Echo %%j Pause Exit /B 2 ) Echo Здесь пишем остальной код pause Exit /B :NoFiles If Not Exist %1 (Echo !!! File %1 not found &Pause &Exit /B 2) Set /A Log=0 FOR /F "usebackq tokens=1* delims==" %%i IN (`FINDSTR /I %2 %1`) DO ( Set /A Log=1 FOR %%f IN (%%j) DO If Not Exist %%f ( Set /A N+=1 Call Set "@@@%%N%%=%%f" ) ) If %Log%==0 (Echo !!! Parameter %2 not found in %1 &Pause &Exit /B 2) Exit /B 0 Цитата Stalker_AleX333:
Вот так, но как это связано с поиском отсутствующих файлов?
@Echo Off cls Set "CFG=Silver Raven mods pack data\fileslist.cfg" Set "Out=Silver Raven mods pack data\fileslist.cfg2" If Not Exist "%CFG%" (Echo !!! File "%CFG%" not found &Pause &Exit /B 2) >"%Out%" (FOR /F "usebackq tokens=1* delims==" %%i IN (`2^>nul More "%CFG%"`) DO ( Echo [%%i] If Not "%%j"=="" FOR %%f IN (%%j) DO Echo %%~f Echo. )) pause Exit /B |
|
------- Последний раз редактировалось megaloman, 22-07-2019 в 11:43. Отправлено: 15:42, 21-07-2019 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - Изменение строк в файле | Nikugorsk | Скриптовые языки администрирования Windows | 13 | 08-06-2018 18:32 | |
VBS/WSH/JS - помогите написать на javascript код для поиска и фильтрации в тхт файле строк. | spiritmen | Скриптовые языки администрирования Windows | 0 | 06-02-2015 23:42 | |
Java - [решено] Вызов метода вне метода -_- | GordonG | Программирование и базы данных | 2 | 04-04-2014 18:42 | |
Теория - Какой алгоритм поиска максимальной общей подстроки выбрать для коротких строк? | seriych | Программирование и базы данных | 4 | 01-04-2014 20:27 | |
Разное - Изменение shell-а поиска | Putin-mode | Оформление Windows XP | 3 | 18-02-2009 15:36 |
|