Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Anton04, а так ли уж Вам нужен универсальный редактор? Может быть, сгодится и прямой способ, наподобие:
Код: Выделить весь код
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, разве что свой скрипт даёт большую гибкость). Вам ведь вряд ли нужно создать файлы преобразований для ста тысяч приложений, скорее — периодически пересоздавать файл преобразований с выходом новых версий приложения, так я понял из предыдущего обсуждения.

Отправлено: 19:15, 25-05-2012 | #30