Цитата El Sanchez:
lmiol, reg.exe он разных разрядностей бывает. В зависимости от окружения, 32- или 64-разрядного, из которого вызвали батник, будет вызван 32- или 64-разрядный reg.exe. Только вот 64-разрядный reg при таком запросе полезет искать в 64-разрядный раздел HKLM\SOFTWARE, 32-разрядный reg в 32-разрядный HKLM\SOFTWARE, который фактически является HKLM\SOFTWARE\WOW6432Node. Steam пишет в 64-разрядный раздел, понятно, что 32-разрядный reg или 32-разрядный Inno, вызывающий 32-разрядный reg, ничего не найдут в 32-разрядном разделе. Начитавшись инторнетов, умники в батниках или ещё где явно пишут WOW6432Node, не думая о разрядности вызывающего, потом в 32-разрядных системах в реестре появляется раздел WOW6432Node, которого быть там не должно, или на 64-разрядных системах в 32-разрядном разделе появляется лишний HKLM\SOFTWARE\WOW6432Node\WOW6432Node.
Чтобы такого не происходило, лучше в reg при запросе сразу указывать в какую ветку лезть параметрами /reg:32 или /reg:64, в таком случае разрядность reg не имеет значения. »
|
Проверил, это не то что надо, это вообще отдельный раздел реестра WOW6432Node
я думал это редирект а оказалось это просто отдельный раздел для 64биток.
Я также исследовал редиректы внутренние, но это не помогло. А также я выяснил что не может читать только с HKEY_LOCAL_MACHINE, а вот с HKEY_CURRENT_USER без проблем читает.
Поэтому я решил пойти другим путем и определить путь игры через Steam.
Вышло даже лучше чем я хотел - я определяю еще и диск (ведь игру можно в либе переместить на другой том)
HTML код:
powershell -Command "$SteamPath=(Get-ItemProperty 'HKCU:\SOFTWARE\Valve\Steam').SteamPath.Replace('/', '\');$LibraryFoldersPath=Join-Path -Path $SteamPath -ChildPath 'steamapps\libraryfolders.vdf';$libraryContent=Get-Content $LibraryFoldersPath -Raw;if($libraryContent -match '\\u0022291550\\u0022\s+\\u0022(\d+)\\u0022'){$matchIndex=$libraryContent.IndexOf($matches[0]);$pathIndex=$libraryContent.LastIndexOf('\\u0022path\\u0022',$matchIndex);if($pathIndex -gt -1){$startPathIndex=$libraryContent.IndexOf('\\u0022',$pathIndex+6)+1;$endPathIndex=$libraryContent.IndexOf('\\u0022',$startPathIndex);$gamePath=$libraryContent.Substring($startPathIndex,$endPathIndex-$startPathIndex);$FinalPath=Join-Path -Path $gamePath -ChildPath 'steamapps\common\Brawlhalla';$FinalPath=$FinalPath.Replace('\\\\', '\');$FinalPath=$FinalPath.Replace('\\', '\'); $FinalPath}else{'Путь не найден.'}}else{'Игра с идентификатором 291550 не найдена.'} $installPath = $FinalPath; $appDataPath = [System.Environment]::GetFolderPath('ApplicationData'); $hubFilePath = '%APPDATA%\Open Mod Manager\Brawlhalla\Maps\channel.omx'; if (Test-Path $hubFilePath) { [xml]$xmlContent = Get-Content -Path $hubFilePath; $installNode = $xmlContent.SelectSingleNode('//install'); $installNode.InnerText = $installPath; $xmlContent.Save($hubFilePath); } "
получилось очень даже хорошо и мой динамический установщик кайфово отпрабатывает и готов к любым обновлениям версий и тому что там разработчик может изменить.
Т.е. мой Inno Setup проверяет только наличие стима и флага что игра установлена (так как всё это для одной игры требуется), а вот путь где установлено, построение конфигов и всё остальное я чекаю через скрипты