我已经使用install4j创建了一个windows服务,并且一切正常,但是现在我需要将它的命令行参数传递给该服务。我知道我可以在新建服务向导中的服务创建时配置它们,但我希望将参数传递给注册服务命令ie:
myservice.exe --install --arg arg1=val1 --arg arg1=val2 "My Service Name1"
或者将它们放入.vmoptions文件中,如:
-Xmx256m
arg1=val1
arg2=val2
这样做的唯一方法似乎是修改我的代码
我想让用户只选择一个组件。有办法做到这一点吗?
Install4j只提供复选框,这不是我想要的。对于安装类型,您必须更高一级。将“安装类型”屏幕添加到安装程序中,并在屏幕上自定义安装类型。每种安装类型都定义了应安装的安装组件
谢谢英格尔的建议。我不明白。这怎么能给我单选按钮。在您向我展示的屏幕截图中,我希望用户安装Hellow world或源文件。不是两者都有。@Aragorn然后添加两种安装类型,一种选择了“Hello world application”,另一种选择了“Source file
好吧,这对我来说有点难以用语言表达,所以请容忍我
我们的项目目录结构依赖于${sys.installationDir}/jre作为用于运行产品的jre的位置。这对于使用install4j内置安装程序的新安装非常有效,因为install4j默认将jre放在那里
但对于install4j构建的旧式安装更新,这是有问题的
不幸的是,我正在重用的安装代码依赖于Java1.6功能。我有运行1.5的旧版产品,由于其他原因无法更新
我需要允许install4j安装程序将Java 1.6 jre解包到一个临时位
我需要有一个应用程序的快捷方式,该快捷方式预先配置了命令行选项。这将只用于故障排除,所以我不希望它“容易”被用户找到。我的想法是在安装过程中在程序目录中创建一个快捷方式。此快捷方式不在“开始”菜单上。在故障排除过程中,用户将导航到程序目录并双击快捷方式,从而使用调试选项调用程序
有没有一种方法可以使用Install4j操作创建不在“开始”菜单上的应用程序快捷方式?您可以通过“创建开始菜单条目”操作,将“条目名称”属性设置为绝对路径名称,如:
${installer:sys.installatio
我使用最新的Install4J构建了一个安装程序。在Mac OS上,它无法安装,并显示以下消息:“发生内部错误(错误代码:启动路径不可访问)”
对于其他平台(Windows 32/64和Linux),同样的安装程序也可以正常工作。有没有其他人看到了这一点并知道如何修复它?事实证明,这个错误是由我使用的OpenJDK JRE版本引起的。它与我的Mac上安装的JRE版本配合良好。在我的情况下,这是由于Mac JRE使用与Windows相同的文件名造成的。愚蠢的我,盲目的复制粘贴。
我从gradle插件运行install4j,但使用用户界面编辑install4j文件。但我发现每当我创建新版本时,总是要手动更新我的常规设置->应用程序信息->版本,这很烦人。这已经存储在源代码中的一个文件中,所以我只想读取该文件以避免额外的输入
如何读取此文件,获取版本信息,然后在常规设置->应用程序信息->版本中使用它
提前谢谢 我建议从构建过程中调用install4j,install4j支持ant、gradle和maven,也可以通过命令行可执行文件调用
在这种情况下,您可以设置版本
使
我尝试了“运行可执行文件或批处理文件”操作
在安装我的应用程序时,我得到了MSVC++可再发行的弹出窗口
请建议修复程序以避免弹出窗口。请看,我也遵循了同样的方法,它在VC++可再发行版2013中使用vcredist_x64.exe/quiet运行良好。但不适用于使用vcredist_x64.exe/qLikely的2008,它需要与较新版本不同的命令行参数。通过“vcredist_x64.exe/q”使用自定义脚本操作的VC++可再发行2008静默安装
[INFO] com.install4j
如何在Install4j中的资源目录中创建目录,或者是否有任何方法可以在资源目录或资源目录的用户文件夹中添加文件夹。如果您指的是在Installer->Custom code&Resources下添加的文件,则无法在Install4j 8中创建目录结构
我昨天写了我的第一个自定义scren,现在我需要一些信息。我查看了api,但没有发现任何类似于logger类的类。是否可以将自定义信息记录到installation.log文件中,或者是否需要使用log4j单独创建日志文件
问候
哈迪叫一个
Util.logInfo(null, "My message");
Util.logError(null, "My error");
或者,如果你有一个一次性的t
Util.log(t);
类Util位于com.install4.api包中,并在所有脚本
OSX小牛更新后,我的代理/守护进程在几分钟后进入睡眠状态,并停止对用户操作的反应。如何在安装过程中禁用AppNap
这是一个Java应用程序,我使用的是install4j。我在某个地方读到,我应该在这个列表中添加一个条目
~/Library/Preferences/com.apple.LaunchServices.plist
但是,即使手动禁用应用程序的AppNap,我的Macbook上也不存在该列表。该设置必须存储在其他地方
有什么建议吗?找到了答案。将以下条目添加到Info.plist(
好吧,一切都在标题里。
在InstallAnywhere中,在控制台模式下键入back、next或quit。我在install4j中没有见过这样的东西
谢谢
X.在install4j中,控制台模式将用户界面显示为连续的问题流,因此它不会组织到单独的屏幕中
但是,安装程序有一个“控制台屏幕更改处理程序”属性,您可以在其中实现类似的功能。例如,使用类似
if (context.getBooleanVariable("showConsoleNavigation")) {
if (console
我备份了安装过程中需要替换的文件。为此,我使用上述操作。但是,它只是将子目录中的文件复制到目标目录,而不是将源的目录层次结构复制到目标目录。示例:我在此目录结构中有一些文件\dir1\dir2\dir3\files。它只复制dir3下的文件,而不复制\dir1\dir2\dir3。我需要在备份中保留目录结构。有人能帮忙吗
我正在使用Windows7企业版
非常感谢。您必须在操作中选择根目录,即包含“dir1”的目录。然后,它会将整个目录树复制到目标
如果您只想复制目录树的一部分,请使用“目录筛选
我在一个应用程序中有多个启动器,我希望根据安装时提供的标志有选择地安装它,比如在GUI模式下安装一个启动器,在无人值守模式下安装另一个启动器。我们可以在Install4j中实现吗?您可以将启动器放入不同的文件集中,并在运行时以编程方式选择文件集
您可以在“文件->定义分发树”步骤中创建文件集
在启动器向导中,在“可执行信息”步骤中,您可以选择启动器的文件集
在运行时,调用
context.getFileSetById("123").setSelected(false)
防止安装ID为“123”
今天我有一个关于插件安装介质的问题。我们必须创建一个安装程序,安装一些工具来扩展主应用程序。因此,我创建了一个项目,并将其配置为插件安装程序。因此,我将应用程序ID从主应用程序设置为加载项配置。然后我希望安装程序检查主应用程序是否已安装。我还避免捆绑jre,因此安装程序应该使用主应用程序中的jre。当我尝试安装插件时,安装程序会要求合适的jre,然后开始安装组件。我希望出现错误消息,安装将中止。也许我错过了一些配置?你可以打电话给我
ApplicationRegistry.checkApplic
我想向install4j生成的unix卸载脚本添加一个自定义脚本片段。对于launchers选项卡下可用的脚本,这是可能的。这也适用于卸载程序吗?我正在使用install4j 6.0.4。是的,您可以。
如果要在卸载文件步骤之前运行所需的shell脚本(因为脚本不再位于文件系统上)
如果要运行Java代码,可以在删除文件后执行:
在运行脚本步骤中添加Java代码。此遗漏将在install4j 7.0.7中修复,其中安装程序应用程序将具有“自定义脚本片段”属性
请联系support@ej-tec
我们正在使用install4j构建多个设置。所有这些文件都组织在一个项目文件中,包含多个媒体集
我们有一个外部软件,可以自动安装设置。为此,我们需要了解ApplicationID,因为所有安装文件都具有相同的名称
是否有机会将ApplicationID写入setup.exe的属性?或者其他想法 您可以通过两个操作编写这样的文件:
使用变量名“appId”和脚本“设置变量”操作
context.getApplicationId()
使用文本“将文本写入文件”操作
${installer:app
我有其他安装程序的此选项
install.exe-D$FORCE\u UPDATE$=true-l en
这是其他安装程序的选项
这意味着下面。
如果$FORCE_UPDATE$key为“true”值,则安装语言为英语,无语言选择对话框
我想不做任何修改就使用这个选项。
我已经知道如何跳过这样的语言选择对话框。
install.exe-Dinstall4j.language=en
install.exe-Vsys.languageId=en
但是,我想使用旧的选项
我无法修改此选项,因为我已经发
作为安装过程的一部分,我的应用程序需要进行一些编译(我知道这是一种糟糕的形式,但它确实存在)。对于编译,我只需将lib/tools.jar从JDK添加到分发树,并将其添加到启动器的类路径。然后可以通过编程编译类
一个更轻量级的解决方案是使用。我们需要在应用程序旁边安装glassfish 3.1.2.2,它需要完整的jdk而不是jre。那么,是否有可能以与jre相同的方式捆绑jdk?install4j中的jre捆绑不处理jdk。我会检查JDK的哪些部分是实际需要的,并分别添加它们。主要是tools
我们已经使用install4j为我们的Mac OS X定义了自定义uri方案,但是找不到一种方法来使用自定义uri将查询参数作为参数传递给应用程序,以便将这些参数作为参数传递给底层的main方法供我们处理
例如:
customuri://?somekey=value
当在浏览器中打开时,应用程序将打开,其中包含要处理的参数。必须注册应用程序才能处理URL调用
这与install4j无关
看
谢谢Ingo。我们已经在install4j中完成了自定义XML片段定义,以注册自定义URI。但我所关注的是
在操作上选择“使用回滚可执行文件”,不会强制设置可执行文件。如果在执行操作后取消安装,则安装程序将失败,并出现NullPointerException
java.lang.NullPointerException
at com.install4j.runtime.beans.actions.misc.RunExecutableAction.maybeWithExtension(Unknown Source)
at com.install4j.runtime.beans.actio
从终端初始化linux install4j安装程序时,它会在后台显示日志,同时弹出安装GUI。有人能告诉我可能的原因和解决方法吗。如果
-Dinstall4j.logToStderr=true
作为VM参数传递给安装程序,例如在安装程序的“VM参数”属性中
我在install4j中生成了一个服务启动器,并使用安装服务操作将其安装在macOS上。当我在终端中执行status时,即使服务已经启动,它也总是说stopped。如果我使用start启动服务,然后查询状态,则行为相同
stop对正在运行的服务也有任何影响
如何在Mac上运行此功能?在Mac OS上,您必须使用启动CTL来控制服务:
在macOS上,您必须使用launchctl来控制服务:
当可执行文件写入控制台时(使用-console选项),如果我第二次按“enter”,它会将我带回命令提示符,即使可执行文件仍在后台运行。如何强制它将所有内容输出到控制台,并且只有在完成后才返回命令提示符?windows上的安装程序是一个GUI可执行文件,它不能让控制台等待进程完成。有两种解决方法:
1) 在安装程序->屏幕和操作步骤上选择安装程序的“Windows控制台可执行文件”属性。缺点:从资源管理器启动安装程序时,会打开控制台
2) 在命令行上按如下方式启动安装程序:
cmd /c ins
我不想依赖于系统上是否安装了java
我们的产品已经在内部附带了vm,因此用户不必安装任何java或需要安装任何java
但这也是我想为我的产品安装程序,应该没有必要有java在系统上安装产品,这是可能与Launch4J?
因为阅读文档时总是很棘手,所以可以捆绑jre,但这意味着什么?安装程序本身使用它吗?是的,运行安装程序需要JRE,但您可以使用install4j,因此不需要“全局安装”JRE
我想创建一个安装程序,在ProgramData/{myprogram}下创建一些文件,但访问权限仅限于网络服务用户。我可以分配目录的所有权,但目前所有其他用户都可以读取该目录
我已尝试添加“添加Windows文件权限”操作,受信任的“用户”和“已验证用户”未设置权限,但这可能只能添加权限,而不能删除权限
是否可以删除这些权限?或者这是一个错误的想法,我应该为其他地方的程序数据创建目录
我已尝试添加“添加Windows文件权限”操作,受信任的“用户”和“已验证用户”未设置权限,但这可能只能添加权限
我的安装程序需要以root用户身份运行,并且需要以另一个用户的身份退出以启动某些进程。这似乎是许多安装构建者需要完成的任务。在install4j中实现这一点的最佳方法是什么?我没有看到一个操作覆盖它,当我尝试在“运行可执行或批处理文件”任务中围绕命令包装“su”时,它似乎无法运行类似于su的shell内置程序。su不是shell内置程序。必须在“可执行”属性中指定su的绝对路径:
/bin/su
然后,要使用参数“argument”作为用户“guest”调用“actualExecutable”
现在我有一个关于mac操作系统的问题。我为安装程序激活了无人值守模式,并在win系统上进行了尝试。在那里,它工作得很好。现在我想在mac os上启动安装程序,但没有正确运行。我尝试了以下命令:
这将始终启动GUI安装,而不是无人参与模式。也许终端命令不正确
亲切的问候
Hardie“/bin/open”不适用于命令行样式的调用,因为参数的传递是不同步的,并且它们不会传递给main方法。而是直接调用可执行文件:
MyApp.app/Contents/MacOS/JavaApplicationSt
是否可以在or命令行中重写标准编译器变量,如fullName和shortName?release标签与version标签匹配,我们试图在插件的变量配置中定义全名。这对是否可能的问题没有影响。在项目中,将全名设置为类似${compiler:myFullName}的编译器变量。然后可以重写编译器变量myFullName,该变量将设置系统变量
我需要编写一个定制的rest客户端,以便能够在某些情况下处理单点登录身份验证。客户端必须决定是使用sso还是基本身份验证。对于基本身份验证,应显示一个对话框,并要求用户提供凭据。在install4j中已经存在这样一个对话框,我想知道是否可以重用此对话框来获取凭据并将其设置为自定义rest客户端 该信息未保存,因此以后无法检索。相反,您可以设置系统属性“serverAuthUser”和“serverAuthPassword”,以便install4j使用此属性进行身份验证,并且不会显示密码对话框。该
我们希望使用GlobalSign EV证书对Windows和Mac安装程序进行代码签名。目前,instal4j似乎只支持pkcs12密钥存储。是否有任何计划或正在进行的开发能够在不久的将来使用pkcs11代币的EV证书?install4j 8.x将在不久的将来支持pkcs11。目前我无法给出具体的发布日期
作为一种解决方法,请在Windows media向导的“可执行文件处理”步骤中使用本机签名工具。install4j 8.x将在不久的将来支持PKCS11。目前我无法给出具体的发布日期
作为一种
我正在评估我们公司的install4j
我们构建了一个win32安装程序,并试图建立一个持续集成环境来测试它
CI服务器能够使用FTP将安装程序上载到windows目标计算机(这是一个虚拟化环境),并运行如下所示的批处理脚本
cd c:\tmp\upload\
my_installer.exe -q -varfile response.varfile -console
目前我们正在使用install4j 5的试用版
当从命令行(远程桌面上的cmd.exe)运行安装程序时,我会看到一个弹出窗口,
我有一个install4j(v4.x)项目,在应用程序安装时创建了两个不同的启动器(用于两个不同的任务)。有没有办法为第二个启动器指定一个单独的(第二个)JRE(不是在最终媒体文件中指定的)
有点离题,但…
我为什么需要这个?实际上,我需要第二个启动器(这是一个更新程序类型的应用程序)的媒体文件中的JRE的完整副本,以便它可以更新主应用程序的JRE。如果updater与应用程序在同一个JRE上工作,它将无法这样做
也许有更好的方法用我需要的JRE更新应用程序的JRE
另外,我知道install4
在install4j中,我在安装程序配置的何处设置显示在Windows“程序和功能”屏幕的“支持链接”和“帮助链接”下的URL
这两个字段都取自“常规设置”步骤中的“发布者URL”字段。从install4j 5.1.11开始,帮助链接没有单独的字段
在更新安装期间,我需要获取已安装应用程序的ApplicationRegistry.ApplicationInfo。因此,后台:应用程序应该从32位更新到64位,我想从以前的安装中加载响应文件。现在,我尝试使用脚本获取ApplicationInfo,并希望设置安装目录以加载带有相应操作的响应文件。现在我不知道应用程序idgetApplicationInfoById(java.lang.String id)的参数代表什么。是媒体文件id还是启动器的id?对于这两种情况,我都没有得到任何Applica
我有两个目录选择屏幕。
1.安装位置屏幕:选择安装目录
2.目录选择屏幕:选择数据库目录
当我通过点击浏览按钮更改安装目录时
添加了我正在选择的任何路径的额外路径(程序文件)
例如,我选择了路径:“C://somepath”
路径中实际显示的内容:“C://一些路径/程序文件”
我对媒体文件做了一些更改,如下所示
然而,对于目录选择屏幕,我没有这个问题
如何删除额外路径 在“安装位置”屏幕的配置中,取消选择“建议应用程序目录”属性。在“安装位置”屏幕的配置中,取消选择“建议应用程序目录”属性
是否可以将自定义变量添加到ApplicationInfo,以便另一个install4j安装程序可以检查此变量的值
用例是我们希望为应用程序提供一个变量,以便加载项的设置可以检查该变量的兼容性
无法使用该版本检查兼容性。从6.1开始,这是不可能的。您必须在安装目录中保存一个属性文件并读取该文件。从6.1开始,这是不可能的。您必须在安装目录中保存一个属性文件并读取该文件。如我所想,确定。谢谢你的回答。正如我所想的。谢谢你的回答。
我有一个“GeneratedLauncher”,它执行我的java应用程序——应用程序在jar包中。
有没有办法将jar包含到生成的EXE文件(启动器)中?客户希望安装的文件夹中只有exe文件,而不是jar文件。有什么方法可以做到这一点吗?使用install4j无法做到这一点。您可以使用exe4j,通过使用“jarinexe”模式,将生成的可执行文件添加到分发树中,而不是使用生成的启动器。不过,这只适用于Windows
我们已经使用install4j构建了一个安装程序。对于不同版本的软件,生成的可执行文件具有不同的风格,并且可能包含不同的语言。在安装过程中的某个时刻,用户可以选择应该安装哪些语言。因此,将显示一个包含复选框列表的步骤。我现在想测试安装程序中包括哪些语言,并相应地自定义列表
我的问题是:有没有办法在runetime测试安装程序中包含/存在哪些文件?或者我必须在构建时检查此项并包含变量或其他内容吗?目前无法枚举安装程序中包含的文件。您必须在项目中使用文件集、安装组件或定义编译器变量。我有点困惑,因为
此问题与install4j 4.2.8有关
我们正在使用install4j为java应用程序创建“windows存档”类型的媒体文件。尽管大多数用户很乐意下载我们的.exe安装程序,但一些客户需要msi,因此我们使用此.zip工件作为使用第三方工具创建的msi的基础
除了合并捆绑的jre(非共享)之外,这一切都很好。似乎默认情况下,install4j使用pack200算法压缩jre层次结构中的某些jar文件(如rt.jar),并在第一次运行启动程序可执行文件时对其进行解压缩
这一过程显然适用于从
使用install4j创建的Unix安装程序也可以在AIX上运行吗?或者是否有方法/需要为不同风格的Unix创建安装程序?我本来会在AIX上尝试,但目前还没有现成的访问权限。
提前感谢我从未在AIX上尝试过它,但我已经成功地创建了unix安装程序,可以在Linux和Solaris上正常工作。我猜如果你有一个JRE,它会工作。我从未在AIX上尝试过它,但我已经成功地创建了unix安装程序,可以在Linux和Solaris上正常工作。我猜如果你有一个JRE,它会工作。正确,如果Unix有一个兼容PO
今天,我想在前导标签的帮助文本中包含一个安装程序变量,但弹出文本中的输出显示,无法解析安装程序变量。当我把安装程序变量直接作为标签的文本时,它可以被解析。这是一个错误,还是安装程序变量通常无法解决前导标签的弹出式帮助文本和带有帮助文本的其他组件的问题
提前感谢此错误消息表示在构建屏幕时未定义安装程序变量。从install4j 6.0开始,没有在变量定义更改时更新文本的机制,但计划在将来的版本中进行更新。此错误消息表示在构建屏幕时未定义安装程序变量。从install4j 6.0开始,没有在变量定义
我有一个媒体类型单一捆绑MAC安装程序。我需要创建它的附加安装程序。由于MAC插件安装程序只支持文件夹类型,而不支持单一类型,因此,在安装过程中,我面临两个问题:1。它不会在installation location(安装位置)窗口下自动检测已安装的主应用程序,这与windows平台的情况不同,windows平台会自动检测已安装的主应用程序。2.它只在所选目录下安装文件,但应该在/contents/java/app目录下安装。请告知如何解决此问题。我建议创建一个具有以下属性的常规安装程序:
安装
安装屏幕后添加的任何其他屏幕组是否可以作为回滚屏障。
作为升级的一部分,需要在二进制安装后执行数据库升级。如果数据库升级失败,则需要回滚二进制文件。在“安装”屏幕上移除回滚屏障,并在另一屏幕上选择“回滚屏障”属性。在“安装”屏幕上移除回滚屏障,并选择“回滚屏障”另一个屏幕上的属性。观察到,在安装步骤后创建的新屏幕中的某些操作上设置回滚屏障不会触发在安装步骤中安装的二进制文件的回滚。没错,您必须在“安装”屏幕上移除回滚屏障“。我已经编辑了我的答案。观察结果是,在安装步骤后创建的新屏幕中的某些操作上
请告诉我们传递媒体ID以使用Ant构建自动化的选项
<taskdef name="install4j"
classname="com.install4j.Install4JTask"
classpath="${env.INSTALL4J_HOME}\bin\ant.jar"/>
<target name="data-collector-installer">
<install4j
使用Install4j版本7
在“目录选择屏幕”的预激活脚本中,我添加了向导索引并设置了向导索引键
但当我看到屏幕预览时,无法在左面板中看到向导索引
我们需要显示向导索引,该索引将显示安装进度。就像下图一样,它将以粗体显示当前步骤 向导索引仅在运行时显示,而不是在预览中显示。这是因为向导索引通常不是在当前屏幕上设置的,而是在第一个屏幕上设置的。每个想要更改活动步骤的屏幕只为向导索引设置一个新键。install4j IDE中的预览机制没有屏幕流的概念,因此它选择根本不显示向导索引。谢谢,我们将尝试
我有一个带有多个组件的install4j安装程序。对于每个组件,使用适当的条件注册文件关联:
context.getInstallationComponentById("1").isSelected()
用户选择组件后,将进入文件关联屏幕,在该屏幕中,正确地说,仅提供适合所选组件的文件关联
但是,当用户返回一些屏幕并更改所选组件时,“文件关联”屏幕不会更新,仍然显示以前的关联列表
我可以在这个屏幕上强制更新吗
我正在使用install4j Windows Edition 6.1.1(build
我必须实现以下场景:
应用程序使用特定于用户的值安装,如安装目录、服务器url、用户主页等
用户应该启动一个独立的更新程序
更新程序应该自动检查更新,下载文件并在静默模式下启动新的安装程序
安装后,无论更新是否成功,都应显示一条状态消息
因此,我使用Hello示例应用程序的更新程序并删除了用户输入表单。现在检查成功,文件将被下载。但是如何将用户输入值传递给新的安装程序呢?我应该使用响应文件并将此文件设置为静默安装的参数吗
非常感谢
Hardie如果在“安装位置”屏幕上添加“加载响应文件”操作,新
我使用的是install4j 6.0.3,一切都正常工作,但是如果用户试图使用“Browse”按钮更改安装位置,安装程序将完全锁定,您需要使用任务管理器终止该进程
这种情况发生在windows7和windows8(.1)
有人知道如何解决这个问题吗?好的,这非常奇怪,因为我正在根据Ingo进行调试,我选中了选项“允许创建新文件夹”,创建了一个版本,然后再次选中它并创建了另一个版本
该构建现在适用于受影响的用户,我想在配置文件或其他文件中可能有一个潜在的奇怪选项。这是第一个此类报告,我无法复制它。
我已经使用Install4j创建了安装程序。我能够在windows和linux上使用这些安装程序安装该工具
但在windows中,我得到以下例外
StartupHandler.initializeActionManager() ... ERROR: occurred while reading action shcema.
ERROR: SAX2 driver class org.apache.xerces.parsers.SAXParser does not implement XMLRead
我是install4j和stackoverflow的新手,因此,如果我的问题结构不正确,我会提出建议
我们使用的是install4j版本6.1.2(build 6275)。
启动应用程序时,install4j auto update在检查更新时会收到以下错误,并且不会执行更新(应用程序以旧版本启动):
我们的updates.xml文件以以下行开头:
<?xml version="1.0" encoding="UTF-8"?>
我们有多个部
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 18 页