bosyak2005
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Здесь недавно пробегало решение, как подчищать ветку HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\ShellNoRoam\MUICache. Я тут потратил время, написал пару скриптов, которые это делают более корректно. Первый скрипт - cleanupvirt.vbs - ложим в директорию проекта (рядом с build.bat): === Option Explicit Function OnFirstParentStart DoCleanup End Function Function OnLastProcessExit DoCleanup End Function Sub DoCleanup Dim Origin, LastSlash, SourcePath Origin = GetEnvironmentVariable ("TS_ORIGIN") LastSlash = InStrRev (Origin, "\") SourcePath = Left (Origin, LastSlash) Dim WScriptPath WScriptPath = ExpandPath ("%SystemSystem%\wscript.exe") ExecuteExternalProcess (WScriptPath + " """ + SourcePath + "cleanupext.vbs""") End Sub === Второй скрипт - cleanupext.vbs - ложим рядом с готовыми exe-шниками: === Option Explicit WScript.Sleep (2000) 'на случай, если винда вздумает стучать асинхронно Dim MyPath, LastSlash LastSlash = InStrRev (WScript.ScriptFullName, "\") MyPath = Left (WScript.ScriptFullName, LastSlash) Const HKEY_CURRENT_USER = &H80000001 Dim oReg, KeyPath, ValueNames, ValueTypes Set oReg = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv") KeyPath = "SOFTWARE\Microsoft\Windows\ShellNoRoam\MUICache" oReg.EnumValues HKEY_CURRENT_USER, KeyPath, ValueNames, ValueTypes Dim i For i=0 To UBound(ValueNames) If Left(ValueNames(i), LastSlash) = MyPath Then oReg.DeleteValue HKEY_CURRENT_USER, KeyPath, ValueNames(i) End If Next === В этом решении не создаётся никаких временных файлов и, что более важно, ветка удалается не полностью, а только то, что нужно. В принципе, можно ещё усовершенствовать, сделать так, чтобы внешний скрипт - cleanupext.vbs - создавался из внутреннего скрипта автоматически (в случае отсутствия). Но тогда его нужно ложить не рядом с exe-шниками (ведь exe-шики могут лежать на readonly носителе), а в песочнице. Но я не знаю, как узнать текущий путь к песочнице. Ещё я заметил, что такие функции, как OnFirstParentStart и OnLastProcessExit срабатывают не всегда. Например, в случае зависания синстального приложения при запуске (вероятно, по причине зависания виртуального сервиса, глубоко не исследовал) иногда не запускается ни тот ни другой скрипт и след в MUICache остаётся. |