Inno setup 在Inno Setup命令行中使用DIR开关 剧本

Inno setup 在Inno Setup命令行中使用DIR开关 剧本,inno-setup,Inno Setup,我创建了以下简单脚本: [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" #d

我创建了以下简单脚本:

[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 Programs\2019\CommunityTalks\HelpNDoc\CHM
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"

结果 从表面上看,我认为这是可行的。我在屏幕上没有看到任何东西,只是被请求允许运行应用程序。但是我在指定的
目录中找不到该文件

所以我又看了一遍日志:

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 Programs\2019\CommunityTalks\HelpNDoc\CHM\Output\PublicTalksHelpDocumentationSetup.exe
2019-05-31 21:32:02.971   Setup command line: /SL5="$15002A,25665310,721408,D:\My Programs\2019\CommunityTalks\HelpNDoc\CHM\Output\PublicTalksHelpDocumentationSetup.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:\Users\ajtru\AppData\Local\Temp\is-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:\WINDOWS\CommunityTalks.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文件名:C:\WINDOWS\CommunityTalks.chm

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

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

Source: "CommunityTalks.chm"; DestDir: "{param:InstallPath}"; Flags: ignoreversion
我将命令行从使用
DIR
调整为
InstallPath
,但是IMHO
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,
        'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+'_is1',
        'Inno Setup: App Path', sPrevpath) then
        RegQueryStringValue( HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\'+AppID+'_is1' ,
                            'Inno Setup: App Path', sPrevpath);

    Result := sPrevPath;
end;
因为我知道应用程序id。如果他们移动了程序或其他东西,传递它的好处将满足他们的需求。但是我的问题仍然是关于DIR的失败。

引用:

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


通常,如果Windows找不到您的提要所在的文件夹,它将默认为Windows文件夹。可以尝试在双引号中加单引号,或者尝试将引号加倍,如“C:\Program Files…”?否则,我会对该目录制作一张cd,这样您就不必在那里的命令中指定它了。@shadoe2020谢谢,但这不是问题所在。如果我把DIR换成InstallPath,然后把{app}换成{param:InstallPath},它就可以工作了。因为向导页面未显示,所以它不会将DIR转换为{app},因为文档表明此开关用于设置选择目标向导页面的默认值。谢谢。因此,我应该将
CreateAppDir
设置为
True
。非常静默安装不会有任何副作用?我不认为
CreateAppDir
会干扰静默安装。如果我将其设置为
True
,它会告诉我需要一个
DefaultDirName
条目。因此,我可能会让它保持使用自定义参数的状态。至少你已经解释了为什么以及我必须做什么。因为我会设定什么?因为这个小例程被设计成通过命令行告知路径。
/DIR
无论如何都会覆盖该值+当未指定
/DIR
时,您希望代码做什么?+如果您需要强制存在
/DIR
开关(或您的自定义开关),则您可以使用该代码。然后根本不使用
DefaultDirName