在installshield / installscript中执行命令行语句

时间:2014-06-12 05:40:15

标签: installscript installshield-2011

如何在安装期间在installscript中执行以下命令?

netsh.exe advfirewall firewall show rule name="PowerSI (Release ASI 16.64)" || NETSH.EXE advfirewall firewall add rule name="PowerSI (Release ASI 16.64)" dir=in action=allow program="d:\Cadence\HIM_asi1664\ASI\Update4\SpeedXP\SpeedXP Suite x64\PowerSI.exe" enable=yes profile=any description="d:\Cadence\HIM_asi1664\ASI\Update4\SpeedXP\SpeedXP Suite x64\PowerSI.exe"

请注意,上面的命令包含两次可执行文件名,即netsh.exe,这就是问题所在。我首先尝试LaunchAppAndWait使用整个命令作为可执行文件的名称并将空字符串作为参数传递。接下来我尝试将第一个netsh.exe作为程序名称传递,将剩余的文本作为参数传递。这两种方法都不起作用。

2 个答案:

答案 0 :(得分:3)

由于问题是关于InstallScript的,所以这里有一个简单的功能。

// prototype void CmdExecute( STRING );
//---------------------------------------------------------------------------                                                                        
//  Function: CmdExecute
//
//   Purpose: Asynchronusly execute a command line statement in the background
//
//---------------------------------------------------------------------------
function void CmdExecute( szCommand )
begin   
    LaunchApplication( "cmd.exe", "/C " + szCommand, "", 
                        SW_HIDE, 0, LAAW_OPTION_NOWAIT );
end;

在您的具体情况下,如果您需要执行一系列命令,或者遇到其他并发症,我建议使用批处理文件。如果需要,您可以动态编写一个(在没有向项目添加文件的情​​况下使用纯的installscript解决方案),通过LaunchApplication(或其变体)运行它,然后删除它。

作为一个不错的小技巧,我喜欢将这样的批处理文件删除。怎么样?最后,添加:

cmd.exe /C timeout 30 >nul & del "%0" /q

这会启动一个单独的进程,因此批处理文件不再使用。完整的30秒延迟并非真的有必要,但事实证明它在过去总是对我有用。如果你想快点完成,你可以调整那个时间。关键是要确保可以删除批次,如果它正在使用中,它就不会被删除。

答案 1 :(得分:0)

自定义操作向导 - >启动Exectuable - >存储在目录表中 - > SystemFolder(作为来源)

然后对于目标做:cmd /c "SOMETHING"

其中SOMETHING替换为您的命令。你唯一需要担心的是逃避所有的双引号。

然后在执行序列中的“Cost Finalize”之后对动作进行排序,你应该很好。

尚未对其进行全面测试,但应该可以正常使用。