- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Pascal Script 函数来读取和检测文件的数组中有多少个名称。当它确定名称数量时,我想要一个 #for
循环来迭代该数量。
我可以使用 Pascal Script 读取和检测名称的数量。问题是,我不知道如何在名称计数过程之后设置 numberOfElements
变量的值。必须将其设置为刚刚使用 Pascal Script 函数读取的名称数量。
这里是一些示例代码:
#define numberOfElements
#sub CreateSubInstallation
[Languages]
//code ommitted
[Files]
//code ommitted
[Run]
//code ommitted
#endsub
#for {i = 0; i < numberOfElements; i++} CreateSubInstallation
采用不同的方法也可以。我只想从文件中读取多个名称,然后根据名称数量制作安装副本。因此,每个名称都有其自己的安装。更详细地说,每个名称都有自己的:目录、子目录和文件中的变量,这些文件会将名称“注入(inject)”到其中。
以下是 INI 文件的格式:
[Customer]
customers={"customerName1","customerName2"}
以下是使用 Pascal Script 读取和检测名称的代码:
{ Get the customer names from file }
function GetCustomersFromFile(fileName : string): string;
var
lines: TArrayOfString;
amountOfLines,i: integer;
tempResult: string;
begin
tempResult := '';
if LoadStringsFromFile(fileName, lines) then
begin
amountOfLines := GetArrayLength(amountOfLines);
{ Keep reading lines until the end of the file is reached }
for i := 0 to amountOfLines - 1 do
begin
if (Pos('customers', lines[i]) = 1) then
tempResult := lines[i];
end;
{ if not found return -1 }
if (tempResult = '') then
{ this result is for debugging and }
{ will have no impact on the array population process }
tempResult := '-1';
Result := tempResult;
end;
end;
{ Count the number of elements present in the array in the file }
{ Done for tempArray initilization }
function CountNumberOfStringElements(line : string): integer;
const
chars = ['0'..'9', 'a'..'z', 'A'..'Z'];
var
ignoreCommas: Boolean;
numElements, numValidText: integer;
i: integer;
begin
ignoreCommas := false;
numValidText := 0;
numElements := 0;
{ Loop through text }
for i := 0 to Length(line) - 1 do
begin
if (line[i] = '"') then
ignoreCommas := (NOT ignoreCommas);
if ((line[i]) IN chars AND (ignoreCommas)) then
Inc(numValidText);
if((line[i] = ',') AND (NOT ignoreCommas) )then
Inc(numElements);
end;
if (numElements >= 1) then
result := numElements + 1
else if ((numElements = 0) AND (numValidText > 0)) then
result := 1
else if ((numElements = 0) AND (numValidText = 0)) then
result := 0;
end;
这本质上就是我希望安装程序执行的操作,只是一个非常精简的版本。
[Setup]
AppName=My Program
AppVersion=1.5
WizardStyle=modern
DefaultDirName={autopf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma2
SolidCompression=yes
OutputDir=userdocs:Inno Setup Examples Output
ArchitecturesAllowed=x64
ArchitecturesInstallIn64BitMode=x64
[Files]
Source: "MyProg-x64.exe"; DestDir: "{app}/customer1/"; DestName: "MyProg.exe"
Source: "MyProg.chm"; DestDir: "{app}/customer1/"
Source: "Readme.txt"; DestDir: "{app}/customer1/"; Flags: isreadme
Source: "MyProg-x64.exe"; DestDir: "{app}/customer2/"; DestName: "MyProg.exe"
Source: "MyProg.chm"; DestDir: "{app}/customer2/"
Source: "Readme.txt"; DestDir: "{app}/customer2/"; Flags: isreadme
[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
请注意之所以这样构造是因为它们是服务。每项服务最终都会包含更多与客户相关的内容。整个安装过程必须使用 .exe 完成,而删除过程则必须使用不同但单一的 .exe 完成。
最佳答案
你的问题很不清楚。但我会尽力给你一些答案。
如果我理解正确的话,您希望在 INI 文件中为每个客户部署相同的文件集。如果您需要在运行/安装时读取 INI 文件(这是可能的,如果您在编译时读取 INI 文件),则无法在 Inno Setup 中使用 [Files]
部分执行此操作。
如果您需要在运行/安装时克隆文件,您所能做的就是将它们安装到临时文件夹,然后使用 Pascal 脚本复制它们。
[Files]
Source: "MyProg.exe"; DestDir: "{tmp}"
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
I: Integer;
SourcePath: string;
TargetPath: string;
begin
if CurStep = ssPostInstall then
begin
for I := 0 to NumberOfCustomers - 1 then
begin
SourcePath := ExpandConstant('{tmp}\MyProg.exe');
TargetPath := GetPathForCustomer(I) + '\MyProg.exe';
if FileCopy(SourcePath, TargetPath, False) then
begin
Log(Format('Installed for customer %d', [I]));
end
else
begin
Log(Format('Failed to install for customer %d', [I]));
end;
end;
end;
end;
(您必须将 NumberOfCustomers
和 GetPathForCustomer
替换为您的实现)
尽管如此,您将不会获得任何进度条,并且会丢失 Inno Setup 的所有内置错误处理功能。您还必须在 Pascal Script 中实现卸载。
<小时/>如果您在编译时读取 INI 文件,那肯定会更好。这意味着您必须在每次更改 INI 文件时重新生成安装程序。但这可以通过单击一下命令行编译器来完成。
尽管使用预处理器解析 INI 文件并不容易。
<小时/>另一个黑客解决方案是在[Files]
部分中生成大量相同的条目,然后可以在运行/安装时动态地将其与客户关联。它不是通用的,因为总会有一个上限。但如果你知道你永远不会拥有比例如更多的东西。 100个客户,这是一个可行的选择。进度条、错误处理和卸载都将起作用。
我不明白,[Languages]
部分与 INI 文件有什么关系,所以我跳过它。
旁注:您的 GetCustomersFromFile
和 GetCustomersFromFile
可以使用 GetIniString
替换为几行代码和TStringList.CommaText。但这是一个单独的问题。
关于arrays - 创新设置: Single installer that reads names from an INI file and creates an installation for each name,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944160/
我是 Maven 新手,正在尝试了解它是如何工作的。 我知道生命周期由多个阶段组成。阶段称为他们的魔力。如果调用一个阶段,则前面的所有阶段也会执行。例如,当我调用 mvn install 时就会发生这
我想安装Ros(机器人操作系统)的驱动程序,我有两个选项:二进制安装和从源代码编译安装。我想知道哪种安装更好,每种安装有哪些优点和缺点。 最佳答案 源:又称源代码,通常位于某种 tarball 或 z
以及更具体的问题。我的理解对吗: “nuget install”总是安装到您运行它的目录吗? “choco install”安装到特殊的 choco 目录,然后运行脚本在系统中传播它? “nuget
我创建了 Android 项目,但随后我立即得到出现错误的信息。 Warning:(22, 12) Dependency on a support library, but the SDK insta
我的安装程序有 32 位和 64 位版本,它们具有(几乎)完全相同的代码和自定义操作序列(只有与此问题无关的细微差别) 我希望我的安装程序能够检测它之前是否已安装,并在这种情况下运行我自己的代码,而不
我在TFS版本中使用npm install cmd。我总是得到以下警告: npm WARN optional dep failed, continuing fsevents@0.3.1 如何删除此警告
是否可以将install(TARGETS ...)与在add_subdirectory添加的目录中定义的目标一起使用? 我的用例是,我想为gtest构建一个rpm的e.gg。 gtest项目恰好有一个
我需要使用 MSI 创建安装程序,其目的是根据用户的区域(从环境变量读取)调用正确的安装程序。也就是说,这个安装程序应该有 3 个文件(它们本身就是安装程序),一个用于美国,一个用于欧洲,一个用于亚洲
我正在尝试通过 Android Studio 3.5 在我的小米 RedMi S2 上运行我的应用程序。在手机上安装应用程序时抛出错误: Installation did not succeed. T
使用govendor时,go install、govendor install +local和govendor install +vendor,^program有什么区别? govendor inst
我用谷歌搜索了很多,但找不到答案。因此,在 Windows Installer 属性值中可以存储多少个字符。如果你给出答案,你能提供答案的来源吗? 最佳答案 我问 Windows Installer
Cuda v9.0 有几个补丁 我应该安装最新补丁还是安装所有补丁? https://developer.nvidia.com/cuda-90-download-archive?target_os=W
我正在尝试通过它的文档安装 phalcon!在这一步我有一个错误: installation/FreeBSD Command: pkg_add -r phalcon 错误: 'pkg_add' is
我有一个安装,如果应用程序退出,它会升级该应用程序的先前版本。当安装处于升级模式时,我想跳过某些操作。如何确定安装是在升级模式还是首次安装模式下运行? 我正在使用 Wise Installer,但我认
MSI 数据库包含一个表 MsiFileHash 。根据文档MsiFileHash 表用于存储 Windows Installer 包提供的源文件的 128 位哈希。 有人知道使用/应该使用什么哈希算
我尝试在本地和全局运行 npm install browserify (-g) 但我总是遇到以下错误 npm ERR! peerinvalid The package bn.js does not s
我有一个用于我正在构建的 python 模块的 SConstruct 文件: import distutils.sysconfig env = Environment(CPPPATH=['includ
使用 Installshield 2010 和 Basic MSI 项目。 我有一个之前由我的安装程序安装的 exe。该 exe 需要在安装程序升级期间运行。有没有办法保证安装程序不会尝试关闭进程?基
我是围棋初学者。我试图编译一个 go 项目,但找不到任何解释“/...”的文档或文章。 cd ~/src/ephenation-server go install -v ./... 等待您的帮助。 最
我试过在选择和不选择‘安装Mongo指南针’选项的情况下运行安装程序,但我仍然无法安装它,也无法取消安装。然后,此设置对话冻结20-30分钟以上,没有任何进展。这实际上就是从他们的website(ht
我是一名优秀的程序员,十分优秀!