Inno setup 如何获得Exec';Inno设置中的ed程序?

Inno setup 如何获得Exec';Inno设置中的ed程序?,inno-setup,Inno Setup,是否有可能获得Exec可执行文件的输出 我想向用户显示一个信息查询页面,但在输入框中显示MAC地址的默认值。是否有其他方法实现此目的?是的,使用标准输出重定向到文件: [代码] 函数NextButtonClick(CurPage:Integer):布尔值; 变量 TmpFileName,ExecStdout:string; 结果代码:整数; 开始 如果CurPage=wpWelcome,则开始 TmpFileName:=ExpandConstant('{tmp}')+'\ipconfig_res

是否有可能获得
Exec
可执行文件的输出


我想向用户显示一个信息查询页面,但在输入框中显示MAC地址的默认值。是否有其他方法实现此目的?

是的,使用标准输出重定向到文件:

[代码]
函数NextButtonClick(CurPage:Integer):布尔值;
变量
TmpFileName,ExecStdout:string;
结果代码:整数;
开始
如果CurPage=wpWelcome,则开始
TmpFileName:=ExpandConstant('{tmp}')+'\ipconfig_results.txt';
Exec('cmd.exe','/C ipconfig/ALL>“+TmpFileName+”,'',SW_HIDE,
EWWAIT未过滤,结果代码);
如果LoadStringFromFile(TmpFileName,ExecStdout),则开始
MsgBox(ExecStdout,mbInformation,MB_OK);
{对文件的内容执行操作…}
结束;
DeleteFile(TmpFileName);
结束;
结果:=真;
结束;
请注意,可能有多个网络适配器,因此有多个MAC地址可供选择。

我不得不做同样的事情(执行命令行调用并获得结果),并提出了一个更通用的解决方案

如果在实际调用中使用带引号的路径,它还通过使用
cmd.exe
/S
标志来修复奇怪的错误

{Exec,输出存储在result中。}
{ResultString只有在返回True时才会更改。}
函数ExecWithResult(const Filename,Params,WorkingDir:String;const ShowCmd:Integer;
const Wait:TExecWait;var ResultCode:Integer;var ResultString:String):布尔值;
变量
TempFilename:字符串;
命令:字符串;
开始
TempFilename:=ExpandConstant(“{tmp}\~execwithresult.txt”);
{通过cmd执行并将输出重定向到文件。必须使用特殊的字符串行为才能工作。}
命令:=
格式(“%s”/s/C“%s”%s>“%s”[
ExpandConstant({cmd}')、文件名、参数、临时文件名];
结果:=Exec(ExpandConstant('{cmd}'),命令,WorkingDir,ShowCmd,Wait,ResultCode);
如果没有结果的话
出口
LoadStringFromFile(TempFilename,ResultString);{不能失败}
删除文件(TempFilename);
{删除末尾的新行}
如果(长度(结果字符串)>=2)和(结果字符串[长度(结果字符串)-1]=#13)和
(结果字符串[长度(结果字符串)]=#10)然后
删除(ResultString,长度(ResultString)-1,2);
结束;
用法:

成功:=
ExecWithResult('ipconfig'、'/all'、''、SW_HIDE、EWWaitUnterminated、,
结果代码,ExecStdout)或
(结果代码0);
还可以将结果加载到
TStringList
对象中,以获取所有行:

行:=TStringList.Create;
Lines.Text:=ExecStdout;
{…一些代码…}
行。免费;

注意,与其硬编码“cmd.exe”,不如使用
ExpandConstant({cmd}')
。(当然,最好还是使用适当的API,而不是试图捕获控制台命令的输出,因为后者可能会在没有通知的情况下更改,因为它是针对人类的。)澄清一下:您需要通过命令提示符运行程序以获得重定向。我最初看了这个答案,很困惑为什么这对我不起作用,原因是我没有意识到重定向是命令提示符的功能,而不是windows的功能,所以你需要在cmd.exe/c上执行unicode安装,必须使用:
var ExecStdout:AnsiString您不能直接将此技术用于powershell,因为它会生成带有BOM的utf16文件名。InnoSetup似乎没有提供任何转换功能。非常感谢您提供如此详细的示例。很明显,为了走到这一步,你解决了很多问题,为我节省了很多时间。我将其与
任务列表
任务杀死
一起使用,以在安装和卸载期间检测和杀死正在运行的应用程序。使用示例中的一个小问题是:如果Exec成功,但结果代码为0,则结果代码将填充被调用程序的退出代码,而不是windows错误,因此,SysErrorMessage将无法获得正确的消息。此外,非零退出代码有时也可以。我建议根据上下文分别测试ResultCode。有关此混淆的详细信息:。是,示例中的异常消息依赖于windows exit codes=>这是返回的MS错误代码的参考。退出代码来自并且不一定是同一事物。例如,
ipconfig/?
不是错误,但返回退出代码1。如果使用ewNoWait或ewWaitUntilIdle,结果代码将始终为259,这是GetExitCodeProcess函数中的保留代码,表示仍处于活动状态。好的,我删除了示例中的异常部分。这取决于实际做了什么。只是想显示结果被传递给InnoSetup并可以使用。