Shellexec vs Exec vs Shellexec我的批处理文件

时间:2012-04-29 17:09:59

标签: exec inno-setup shellexecute

我在帮助中找不到Shellexec和Exec之间差异的详尽解释。是

Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

相当于

Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 

使用exe文件时?当然,当我想要执行与exe或批处理不同的文件时,请使用Shellexec。

然而,有时候,我无法通过Shellexec和Exec使我的指示正常工作。唯一可行的解​​决方案是编写批处理文件并通过shellexec运行它。就个人而言,我不喜欢这个解决方案,因为我必须处理一个临时文件而且我不相信所获得的结果代码。 现在我必须回到批处理文件解决方案,因为我不知道如何使这个指令工作:(错误是如果目标文件尚不存在,它会引发指令失败,在命令提示符下,即使目标文件不存在,该指令仍可正常工作。)

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema>C:\myappdir\backup\newbackup.sql'; 
//the destination folder exists, the file newbackup.sql does not exist      
Shellexec('',mysqldump,params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode);

我正在使用Windows 7 64位,该程序(Inno安装程序安装程序)以管理权限运行

3 个答案:

答案 0 :(得分:5)

在Inno Setup的那种情况下,这两个电话几乎完全相同。但是,如果设置在最低权限运行,并且您尝试运行需要提升的流程,ShellExec()将允许它提示,而Exec()将失败。

当传递单个整体命令行,传递不可执行文件或使用"open"以外的动词时,两者之间会出现差异。

请注意,这两个函数都不允许您运行命令解释程序提供的命令或操作,如重定向运算符(... > ...)。 这些命令需要传递给{cmd}才能运行。

这是一些空气代码:

mysqldump := 'C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin\mysqldump.exe';
params := '-uroot -ppassword myschema';
dumpfile : = 'C:\myappdir\backup\newbackup.sql';

command := AddQuotes(mysqldump) + ' ' + params + ' >' + AddQuotes(dumpfile);
Exec(ExpandConstant('{cmd}'), '/C ' + command, '', SW_HIDE, ewWaitUntilTerminated, ResultCode); 

答案 1 :(得分:2)

您是否考虑过使用CreateProcess来启动此流程?此调用提供了一些额外的选项来控制生成的过程,也可以处理更好的传递的参数。

答案 2 :(得分:2)

如果你可以使用JEDI JVCL库,它们有一个很好的组件,可以为你封装CreateProcess:

http://jvcl.delphi-jedi.org/

查看JvCreateProcess和JvCreateProcessExtended组件。 JEDI JVCL是免费和开源的,并根据Mozilla Public License发布。