我试图在CustomAction表中添加一个自定义操作,问题是,由于请求的类型是格式化的,所以当我试图向列中插入字符串时,列名msi.The是数据类型的Formatted.It失败。
WindowsInstaller.Installer ins = (WindowsInstaller.Installer)new Installer();
string strFileMsi = @"D:\Pack.msi";
Database db3 = ins.OpenDatabase(strFileMsi, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeDirect);
System.Console.WriteLine("testing 1");
WindowsInstaller.View vw3 = db3.OpenView("INSERT INTO CustomAction (Action,Type,Target) VALUES ('DeleteAction',3174,'\'Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If')");
vw3.Execute(null);
System.Console.WriteLine("testing");
db3.Commit();
vw3.Close(); 它总是抛出异常,我能够在Action中添加值,而不会出现任何problem.The问题,而目标是格式化的数据类型。
发布于 2016-01-15 19:55:10
如果抛出异常的是view.Execute,那么可以这样说,只是为了显式。另外,在异常本身(或内部异常)的某个地方,应该有一个与MSI相关的错误号或文本,它用MSI术语说明了异常的细节。
总之,Target是格式化的,这是文本。文本字符串的最大长度为255个字符,根据我的计算,文本长度超过255个字符。这很可能是问题所在。您可以用一个非常小的字符串进行测试以验证。您的替代方法是将脚本插入二进制表并相应地更改自定义操作。
发布于 2016-01-21 12:32:08
我没有重新格式化字符串,所以在使用它之前检查它:
WindowsInstaller.View vw3 = db3.OpenView("SELECT * FROM CustomAction");
vw3.Execute(null);
Record record = ins.CreateRecord(4);
record.StringData[1] = "DeleteAction";
record.IntegerData[2] = 3174;
record.StringData[4] = "Option Explicit\n\n'On Error Resume Next\nDim objFSO, strappfolder, WshShell, strprogramfiles, WshProcessenv\nDim intFilesCount, intSubFolderCount, intFileCount, objGetFolder, ObjFolder\nSet objFSO = CreateObject(\"Scripting.FileSystemObject\") \nset WshShell = CreateObject(\"Wscript.Shell\")\nset WshProcessenv = WshShell.Environment(\"Process\")\nstrprogramfiles = WshProcessenv(\"PROGRAMFILES(x86)\")\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\err.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\err.txt\"\nEnd If\n\nIf ObjFSO.FileExists(strprogramfiles & \"\\datavision -BMS\\out.txt\") Then\nobjFSO.DeleteFile strprogramfiles & \"\\datavision -BMS\\out.txt\"\nEnd If\n\n If ObjFSO.FolderExists(strprogramfiles & \"\\datavision -BMS\") Then\n\n Set objFSO = CreateObject(\"Scripting.FileSystemObject\")\n\n Set objGetFolder = objFSO.GetFolder(strprogramfiles & \"\\datavision -BMS\")\n\n ObjFSO.DeleteFolder strprogramfiles & \"\\datavision -BMS\"\n End If";
vw3.Modify(MsiViewModify.msiViewModifyInsert, record);https://stackoverflow.com/questions/34812422
复制相似问题