我一直在尝试在 Delphi 应用程序中使用 ShellExecute 打开 Mysql 并运行脚本。
ShellExecute(Handle, 'open', PWideChar(InpCommandProgram.text),
PWideChar(commandline), nil, SW_SHOWNORMAL);
InpCommandProgram.text = 'MYSQL'
commandline = '--user=root --password=password < C:/directory/filename.sql '
filename.sql 已被精简为“创建数据库名称”。
命令窗口会短暂打开并滚动一些消息 - 速度太快而无法阅读。
如果我打开命令窗口并输入相同的程序和命令行,它就可以工作。
失败时我看不到错误消息。
我在 Windows 7 桌面上本地运行。
我尝试将输出定向到日志文件,但我什至没有批量获取该文件。当交互成功时,我确实会收到日志。我已经尝试了所有我能想到的调整。
任何有关如何进行的想法将不胜感激。
当您说完全相同的命令在命令提示符下运行时,您自己也说过了。区别在于命令解释器的存在,cmd.exe
。它的作用是创建一个管道,将输入文件传送到 MySQL 进程中。
对于这个问题,你有两个明显的解决方案:
- Use
CreateProcess
启动该过程并自行设置管道。这是一个有点低级的内容,涉及相当多的 Win32 样板文件。如果您需要这样做,它确实使阻塞直到进程完成变得更简单。
- Get
ShellExecute
调用cmd.exe
并询问cmd.exe
运行 MySQL 并整理管道。
选项 2 更简单。它看起来像这样:
ShellExecute(
0,
nil,
'cmd.exe',
'/c mysql --user=root --password=password < C:/directory/filename.sql',
nil,
SW_SHOW
);
The /c
切换到cmd.exe
告诉执行命令然后终止——这正是您想要的。
如果您需要阻塞进程直到 MySQL 进程完成,那么您可以切换到ShellExecuteEx
。这将返回一个您可以等待的进程句柄。同样操作起来有点困难,但可能仍然比CreateProcess
因为这迫使你管理管道。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)