Показать полную графическую версию : Изменение метода поиска строк в конфиге
Stalker_AleX333
03-07-2019, 20:37
Как бы мне вот это:
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
и т.д. и т.п.
[ДругойПараметр]
бла-бла-бла
greg zakharov
04-07-2019, 15:23
Stalker_AleX333, лучше отказаться от идеи использовать для разборка конфигурационных файлов командные сценарии в пользу PowerShell и WinAPI.
Stalker_AleX333
04-07-2019, 21:40
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!"
Но работающий как надо вариант нужен был еще вчера...
greg zakharov
05-07-2019, 20:36
Stalker_AleX333, у вас .cfg файл по структуре похож на .ini, а потому проще, повторюсь, использовать WinAPI, конкретней - GetPrivateProfileString и иже с ним.
Stalker_AleX333
13-07-2019, 22:19
Не буду плодить однотипные темы, подниму эту.
Вот почему-то перестал работать вот этот кусок. Глаза уже "замылились", может я где-то испоганил?
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
)
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" и т.д.
З.Ы. Если что, это чудо должно сверять наличие файлов со списком в конфиге и в случае отсутствия чего-либо ругаться, выводя в столбик список отсутствующего.
Stalker_AleX333
20-07-2019, 18:08
Для справки. В общем, дошел до этого:
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
)
Только, эта штука валится при наличии всех указанных в списке файлов. Еще пришлось спрашивать на других форумах, как нормально обойти игнор спец. символа (в данном случае ! ), встречающегося в именах некоторых файлов.
megaloman
21-07-2019, 15:42
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Восклицаний не боится! Чтобы не было проблем с "!", надо суметь обойтись без setlocal EnableDelayedExpansion@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научить читать файл конфига:
1. в столбик
2. по такому шаблону »@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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.