Anton04, а так ли уж Вам нужен универсальный редактор? Может быть, сгодится и прямой способ, наподобие:
Код:
![Выделить весь код](images/misc/selectcode.png)
Option Explicit
Const msiOpenDatabaseModeReadOnly = 0
Const msiOpenDatabaseModeTransact = 1
Dim strPath2OriginalMSI
Dim strPath2WorkingMSI
Dim strPath2MST
Dim objFSO
Dim objWindowsInstaller
Dim strQuery
strPath2OriginalMSI = "C:\Песочница\0008\Opera_1164_1403_in.msi"
strPath2WorkingMSI = GetTemporaryName()
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With objFSO
strPath2MST = .BuildPath(.GetParentFolderName(strPath2OriginalMSI), .GetBaseName(strPath2OriginalMSI) & ".mst")
.CopyFile strPath2OriginalMSI, strPath2WorkingMSI
End With
Set objWindowsInstaller = WScript.CreateObject("WindowsInstaller.Installer")
' Меняем путь установки приложения по умолчанию:
strQuery = "UPDATE `Directory` SET `DefaultDir`='MyOperaPath' WHERE `Directory` = 'OPERA' AND `Directory_Parent` = 'ProgramFilesFolder'"
With objWindowsInstaller.OpenDatabase(strPath2WorkingMSI, msiOpenDatabaseModeTransact)
With .OpenView(strQuery)
.Execute
.Close
End With
.Commit
If .GenerateTransform( _
objWindowsInstaller.OpenDatabase(strPath2OriginalMSI, msiOpenDatabaseModeReadOnly), _
strPath2MST _
) Then
WScript.Echo "Create [" & strPath2MST & "]."
Else
WScript.Echo "Can't create [" & strPath2MST & "]."
End If
End With
Set objWindowsInstaller = Nothing
objFSO.DeleteFile strPath2WorkingMSI, True
Set objFSO = Nothing
WScript.Quit 0
'=============================================================================
'=============================================================================
' Серый форум / vbscript: генерация пути для временного файла или папки
' (http://forum.script-coding.com/viewtopic.php?id=1221)
'=============================================================================
Function GetTemporaryName()
Const TemporaryFolder = 2
Dim strTempName
With WScript.CreateObject("Scripting.FileSystemObject")
Do
strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
End With
GetTemporaryName = strTempName
End Function
'=============================================================================
(полагаю, аналогичного результата можно добиться и при помощи существующих утилит/скриптов из комплекта поставки Windows Installer SDK, разве что
свой скрипт даёт большую гибкость). Вам ведь вряд ли нужно создать файлы преобразований для ста тысяч приложений, скорее — периодически пересоздавать файл преобразований с выходом новых версий приложения, так я понял из предыдущего обсуждения.