2011-11-23 113 views
2

進出口工作的軟件,需要psqlodbc司機和PostgreSQL的9.0數據庫, unistalled或者我們沒有用delphi 7安裝這兩個psqlodbc設計了一個安裝程序和PostgreSQL 9默默 一個另一個在後點擊一個按鈕,在這裏一切都正常運行, 但問題是卸載過程中, 我首先要反安裝psqlodbc然後PostgreSQL的9還上的單層按一下按鈕,檢查psqlodbc已經從系統

我想運行PostgreSQL的9 unistaller使用shellpApi只有在psqlodbc已經被卸載後, 截止到現在,我正在檢查'cmd.exe'是否正在運行或者不啓動postgreSQl卸載程序,但sometiti mes停止後psqlodbc'cmd.exe'仍爲n postgreSQl unistaller無法執行,

所以任何請告訴我 如何檢查psqlodbc卸載過程是否完全。

的文件 1.psqlodbc.msi 2.postgresql-9.0.2-1-windows.exe後

安裝/卸載的處理智慧的BAT文件

在先進的感謝:)

回答

0

我如何檢查psqlodbc已完全卸載,這樣我就可以開始unistalling Postgres的

爲我找到了解決辦法 On stackoverflow itself

function TForm1.ExecAndWait(const CommandLine: string) : Boolean; 
var 
StartupInfo: Windows.TStartupInfo;  // start-up info passed to process 
ProcessInfo: Windows.TProcessInformation; // info about the process 
ProcessExitCode: Windows.DWord;   // process's exit code 
    begin 
    // Set default error result 
    Result := False; 
    // Initialise startup info structure to 0, and record length 
    FillChar(StartupInfo, SizeOf(StartupInfo), 0); 
    StartupInfo.cb := SizeOf(StartupInfo); 
// Execute application commandline 
    if Windows.CreateProcess(nil, PChar(CommandLine), 
    nil, nil, False, 0, nil, nil, 
    StartupInfo, ProcessInfo) then 
begin 
    try 
    // Now wait for application to complete 
    if Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE) 
     = WAIT_OBJECT_0 then 
     // It's completed - get its exit code 
     if Windows.GetExitCodeProcess(ProcessInfo.hProcess, 
     ProcessExitCode) then 
     // Check exit code is zero => successful completion 
     if ProcessExitCode = 0 then 
     Result := True; 
    finally 
    // Tidy up 
    Windows.CloseHandle(ProcessInfo.hProcess); 
    Windows.CloseHandle(ProcessInfo.hThread); 
    end; 
    end; 
end; 

所以第一步#1 if ExecAndWait('msiexec /x C:\psqlodbc09\psqlodbc.msi') then begin //uninstall postgresNow...!! end;

1

如果驅動程序可用,您可以檢查註冊表。當安裝了它,你將得到:

c:\tmp\pg>reg query "hklm\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI" 

! REG.EXE VERSION 3.0 

HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI 
    APILevel REG_SZ 1 
    ConnectFunctions REG_SZ YYN 
    Driver  REG_SZ C:\Program Files\psqlODBC\0900\bin\psqlodbc30a.dll 
    DriverODBCVer  REG_SZ 03.00 
    FileUsage REG_SZ 0 
    Setup  REG_SZ C:\Program Files\psqlODBC\0900\bin\psqlodbc30a.dll 
    SQLLevel REG_SZ 1 
    UsageCount REG_DWORD  0x1 

當你反安裝它,你會得到(本地化版本):

c:\tmp\pg>reg query "hklm\SOFTWARE\ODBC\ODBCINST.INI\PostgreSQL ANSI" 

Błąd: system nie może odnaleźć określonego klucza rejestru lub wartości. 

c:\tmp\pg> 

(這menas:錯誤:系統無法找到註冊表項或值)

請參閱:reg /?關於如何使用它以及您可以批量使用的返回代碼。

您也可以搜索註冊表卸載信息下HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall

+0

嘿 Ur的想法是好的, 但問題是註冊表項被刪除在unistall過程中... 但unistaller仍然運行那個時間, 我想要的是,該如何知道如果psqlodbc unistall過程是全面完成...... IM使用此BATC文件反安裝的驅動程序psqlodbc ...... 「MSIEXEC/X C:\ psqlodbc09 \ psqlodbc.msi 」 – PresleyDias

+0

我編輯我的問題,..... 我可以檢查如果'msiexec'進程正在運行或者沒有運行,但是在卸載期間這些'msiexec'中有3個正在運行,但是在卸載之後即使psqlodbc卸載完成,''msiexec'仍然在運行!! .....我也可以檢查'cmd.exe',但我發現在一個例子中'cmd.exe'仍然運行,即使在unistall – PresleyDias

+1

因此你必須計算'msiexec'進程。在我的系統上,ProcessExploer顯示了此進程的完整命令行:'「C:\ WINDOWS \ System32 \ msiexec.exe」/ i「C:\ tmp \ pg \ psqlodbc。msi「'但AFAIK並不容易獲得命令行參數 –