2012-07-11 20 views
4

我看到這個問題在這裏:How to get an output of an Exec'ed program in Inno Setup?輸入重定向在Inno Setup中如何工作?

但我無法得到它的工作我自己,註釋掉的代碼是我的嘗試,使這項工作,但我使出一個bat文件,因爲我不能讓我的重定向工作。 CacheInstanceNameCacheInstanceDir的全局變量別處定義:

function CheckCacheExists(): Integer; 
var 
    args: String; 
    buffer: String; 
    ResultCode: Integer; 
begin 
    // args := 'qlist ' + CacheInstanceName + ExpandConstant(' nodisplay > {tmp}\appcheck.txt'); 
    // MsgBox(args, mbInformation, MB_OK); 
    // Exec(CacheInstanceDir + '\bin\ccontrol.exe', 'qlist ' + CacheInstanceName + ExpandConstant(' nodisplay > "{tmp}\appcheck.txt"'), '', SW_SHOW, 

    ExtractTemporaryFile('checkup.BAT'); 
    Exec(ExpandConstant('{tmp}\checkup.BAT'), CacheInstanceDir + ' ' + 
    CacheInstanceName + ' ' + ExpandConstant('{tmp}'), '', SW_SHOW, 
    ewWaitUntilTerminated, ResultCode); 
    LoadStringFromFile(ExpandConstant('{tmp}\appcheck.txt'),buffer); 
    if Pos('^', buffer) = 0 then 
    begin 
    Result := 0 
    end 
    else 
    begin 
    Result := 1 
    end 
end; 

我在做什麼錯?

+0

作爲一個方面說明,經過進一步測試後,我發現只有第一個參數「qlist」才能通過。我一直在敲打我的腦袋試圖想我可能是做錯了,但也許它無關重定向。另外,我可以在調試器中看到所有變量都已填充,並且它們顯然在消息框中正確顯示。 – mcbainpc 2012-07-12 00:52:15

+1

你能更具體一些,*不能讓它工作*不是一個很好的方式來描述你的問題。您是否嘗試過檢查什麼在你的'ResultCode'返回'Exec'功能?另外'Exec'函數有一個返回值,如果失敗(返回False),那麼你很可能會傳遞錯誤的參數給它。 – TLama 2012-07-12 00:52:25

+0

TLama,你的評論是適合的,因此我的評論如上。 – mcbainpc 2012-07-12 00:53:24

回答

9

輸出重定向語法是命令提示符的功能,而不是核心的Windows API。因此,如果你想重定向輸出,那麼你需要通過{cmd} /c actual-command-line > output-file調用該命令。不要忘記在適當的地方加上引號,因爲{tmp}(和其他常量)可能包含空格。

但是,您應該強烈考慮將該批處理文件中的任何內容重寫爲實際代碼。您可以在批處理文件中執行的任何操作都可以直接在Inno腳本中執行,或者直接在腳本中調用的DLL中執行。這允許您更好地控制錯誤檢查和您想要檢索的任何數據的格式。

+0

其中,有趣的是,對另一個問題的答案是什麼(只是少些細節:) – Deanna 2012-07-13 09:40:40

0

嘗試直接與您的args字符串參數的命令行中運行命令,看看結果是什麼,其可能給問題的指示。

此外,請檢查您嘗試重定向您的輸出的文件是否未被其他進程使用。我發現,當這種情況發生時的實際命令會以Exec命令返回True成功執行,但ResultCode指示錯誤並沒有輸出被寫入重定向使用的文件。在另一個實例正在使用的文件的特定實例中,SysErrorMessage(ResultCode)命令僅返回Incorrect function。但是,如前所述,直接在命令行上進行測試會返回該文件正在被另一個進程使用。