2016-04-29 166 views
1

我試圖將{app}目錄中的附加文件夾/文件複製到Inno Setup安裝程序中的Program Files中的其他文件夾中。我寫了一些代碼來執行一個shell命令來使用xcopy,但是我無法使它工作。我試過所有我能想到的權限(shellexecasoriginaluser,Flag = runasoriginaluser,PrivilegesRequired=admin)。如果我手工輸入並運行它cmd它工作正常,所以人們認爲它必須是權限問題?有任何想法嗎?在Inno Setup中使用shell xcopy命令

代碼:

[Files] 
Source: "..\Dialogs\*";DestDir: "{app}\Dialogs"; Flags: ignoreversion recursesubdirs 64bit; AfterInstall: WriteExtensionsToInstallFolder(); 

[Code] 

procedure WriteExtensionsToInstallFolder(); 
var 
    StatisticsInstallationFolder: string; 
    pParameter: string; 
    runline: string; 
    ResultCode: integer; 
begin 
    StatisticsInstallationFolder := SelectStatisticsFolderPage.Values[0]; 
    pParameter := '@echo off' + #13#10 
    runline := 'xcopy /E /I /Y "' + ExpandConstant('{app}') + '\Dialogs\*" "' + ExpandConstant(StatisticsInstallationFolder) + '\ext"' 
    if not ShellExec('',runline, pParameter, '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then 
    begin 
    MsgBox('Could not copy plugins' + IntToStr(ResultCode) ,mbError, mb_Ok); 
    end; 
end; 

回答

1
  • FileName參數應該是唯一xcopy(或相當xcopy.exe)。
  • 命令行的其餘部分轉到Params參數。
  • echo off參數是無稽之談。
  • xcopy使用ShellExec是一種矯枉過正,使用普通的Exec
Exec('xcopy.exe', '/E /I ...', ...) 

雖然一個更好的誤差控制,你最好使用原生Pascal腳本功能:
Inno Setup: copy folder, subfolders and files recursively in Code section


而最後,最簡單,最好的辦法,爲您的具體情況,只需使用[Files]部分條目與scripted constant

[Files] 
Source: "..\Dialogs\*"; DestDir: "{app}\Dialogs"; Flags: ignoreversion recursesubdirs 64bit; 
Source: "..\Dialogs\*"; DestDir: "{code:GetStatisticsInstallationFolder}"; Flags: ignoreversion recursesubdirs 64bit; 

[Code] 

function GetStatisticsInstallationFolder(Param: String): String; 
begin 
    Result := SelectStatisticsFolderPage.Values[0]; 
end; 
+0

非常感謝!我在這工作了幾個小時 –

+0

不客氣。儘管我已經意識到還有更好的方法來滿足您的特殊需求。看到我更新的答案。 –