将 DIR 开关与 Inno 安装程序命令行配合使用



脚本

我创建了这个简单的脚本:

[ISPP]
; SignTool parameters
#define SignedDesc "$qxxx$q"
#define SignedPfx "$qxxx$q"
#define SignedTimeStamp "$qhttp://timestamp.verisign.com/scripts/timestamp.dll$q"
#define SignedPw "$qxxx$q"
#define AppURL "http://www.publictalksoftware.co.uk"
#define AppPublisher "Andrew Truckle"
[Setup]
DisableReadyPage=True
DisableReadyMemo=True
DisableFinishedPage=True
UsePreviousSetupType=False
UsePreviousTasks=False
UsePreviousLanguage=False
FlatComponentsList=False
AlwaysShowComponentsList=False
ShowComponentSizes=False
AppName=Public Talks Help Documentation
AppVersion=19.0.0
CreateAppDir=False
Uninstallable=no
OutputBaseFilename=PublicTalksHelpDocumentationSetup
SourceDir=D:My Programs2019CommunityTalksHelpNDocCHM
SignTool=SignTool /d {#SignedDesc} /du $q{#AppURL}$q /f {#SignedPfx} /p {#SignedPw} /t {#SignedTimeStamp} /v $f
AppId={{xxx}
[Files]
Source: "CommunityTalks.chm"; DestDir: "{app}"; Flags: ignoreversion

如您所见,这非常简单。它旨在由我的主应用程序执行。

<小时 />

测试

我决定尝试通过使用批处理文件进行测试来模拟我的应用程序将要执行的操作。下面是批处理文件命令:

PublicTalksHelpDocumentationSetup /SP- /VERYSILENT /DIR="C:Program Files (x86)Public Talks" /LOG=".TestInstallLog.txt"
<小时 />

结果

从表面上看,我认为它奏效了。除了要求应用程序运行权限外,我没有在屏幕上看到任何内容。但是我在规定的DIR文件夹中找不到该文件。

所以我又看了一下日志:

2019-05-31 21:32:02.971   Log opened. (Time zone: UTC+01:00)
2019-05-31 21:32:02.971   Setup version: Inno Setup version 6.0.2 (u)
2019-05-31 21:32:02.971   Original Setup EXE: D:My Programs2019CommunityTalksHelpNDocCHMOutputPublicTalksHelpDocumentationSetup.exe
2019-05-31 21:32:02.971   Setup command line: /SL5="$15002A,25665310,721408,D:My Programs2019CommunityTalksHelpNDocCHMOutputPublicTalksHelpDocumentationSetup.exe" /SPAWNWND=$30900 /NOTIFYWND=$30914 /SP- /VERYSILENT /DIR="C:Program Files (x86)Public Talks" /LOG=".TestInstallLog.txt"
2019-05-31 21:32:02.971   Windows version: 10.0.17763  (NT platform: Yes)
2019-05-31 21:32:02.972   64-bit Windows: Yes
2019-05-31 21:32:02.972   Processor architecture: x64
2019-05-31 21:32:02.972   User privileges: Administrative
2019-05-31 21:32:02.973   Administrative install mode: Yes
2019-05-31 21:32:02.973   Install mode root key: HKEY_LOCAL_MACHINE
2019-05-31 21:32:02.973   64-bit install mode: No
2019-05-31 21:32:02.979   Created temporary directory: C:UsersajtruAppDataLocalTempis-1NT54.tmp
2019-05-31 21:32:03.227   Calling RestartManager's RmGetList.
2019-05-31 21:32:03.350   RmGetList finished successfully.
2019-05-31 21:32:03.350   RestartManager found no applications using one of our files.
2019-05-31 21:32:03.356   Starting the installation process.
2019-05-31 21:32:03.360   -- File entry --
2019-05-31 21:32:03.360   Dest filename: C:WINDOWSCommunityTalks.chm
2019-05-31 21:32:03.364   Time stamp of our file: 2019-05-30 18:35:24.000
2019-05-31 21:32:03.364   Installing the file.
2019-05-31 21:32:03.539   Successfully installed the file.
2019-05-31 21:32:03.539   Installation process succeeded.
2019-05-31 21:32:03.539   Need to restart Windows? No
2019-05-31 21:32:03.541   Deinitializing Setup.
2019-05-31 21:32:03.557   Log closed.

通知?为什么它把它安装到Windows文件夹中?

2019-05-31 21:32:03.360 Dest filename: C:WINDOWSCommunityTalks.chm

那么如何指定我实际希望将文件安装到的文件夹?

更新

我发现了一个关于使用自定义参数的类似问题。所以我把它改成:

Source: "CommunityTalks.chm"; DestDir: "{param:InstallPath}"; Flags: ignoreversion

我将命令行从使用DIR调整为InstallPath但恕我直言,DIR应该足够了。

<小时 />

替代

我想我可以使用这个 Pascal 脚本,也许可以使用它?然后我不需要传递文件夹:

// Returns the path where the program was last installed
function GetPathInstalled( AppID: String ): String;
var
sPrevPath: String;
begin
sPrevPath := '';
if not RegQueryStringValue( HKLM,
'SoftwareMicrosoftWindowsCurrentVersionUninstall'+AppID+'_is1',
'Inno Setup: App Path', sPrevpath) then
RegQueryStringValue( HKCU, 'SoftwareMicrosoftWindowsCurrentVersionUninstall'+AppID+'_is1' ,
'Inno Setup: App Path', sPrevpath);
Result := sPrevPath;
end;

因为我知道应用程序ID。传递它的好处将满足他们是否移动程序或其他东西。但我的问题仍然是关于DIR的失败。

引用CreateAppDir文档:

如果设置为no,则不会为应用程序创建目录,不会显示"选择目标位置"向导页,并且{app}目录常量等效于{win}目录常量

最新更新