4

如何在安装过程中在 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 作为程序名称传递,其余文本作为参数传递。这两种方法都不起作用。

4

2 回答 2

4

由于问题是专门针对 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 秒的延迟并不是真正必要的,但事实证明过去总是对我有用。如果你想让它快点完成,你可以调整那个时间。关键是确保批次可以被删除,如果它正在使用中则不能。

于 2015-11-19T17:24:51.010 回答
1

Custom Action Wizard --> Launch an Exectuable --> Stored in the Directory table --> SystemFolder (as source)

然后为目标做:cmd /c "SOMETHING"

whereSOMETHING替换为您的命令。您唯一需要担心的是转义所有双引号。

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

还没有完全测试它,但应该可以工作。

于 2014-08-15T21:37:15.733 回答