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

lib*_*lib 5 inno-setup shellexecute exec

我没有在帮助中找到Shellexec和Exec之间差异的详尽解释.是个

Shellexec('','program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 
Run Code Online (Sandbox Code Playgroud)

相当于

Exec('program.exe',params,'',SW_HIDE,ewWaitUntilTerminated,ResultCode) 
Run Code Online (Sandbox Code Playgroud)

使用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);
Run Code Online (Sandbox Code Playgroud)

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

Dea*_*nna 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); 
Run Code Online (Sandbox Code Playgroud)

  • 啊,我错过了 inno-setup 标签,在那种情况下,是的,它们几乎相同,并且可以进行解析。如果无论如何,安装程序以受限用户身份运行,或者“ShellExecAsOriginalUser”,然后它会在需要时要求提升。在这种情况下,`Exec()` 将失败。 (3认同)
  • +1,考虑 InnoSetup 标签和问题本身的第一个答案!但是,如果进程需要,它也会处理提升,而 CreateProcess() 不需要,这里有点令人困惑,函数 `ShellExec` 和 `Exec` 使用与安装程序本身相同的权限。 (2认同)
  • 谢谢你!现在我明白为什么它不起作用了!抱歉,Delphi 标签位于第一位,也许它具有误导性 (2认同)