我一直在尝试在 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 进程中。
您对这个问题有两个明显的解决方案:
- 使用
CreateProcess
启动进程并自行设置管道。这是一个有点低级的内容,涉及相当多的 Win32 样板文件。如果您需要的话,它确实使阻塞直到进程完成变得更简单。 - 获取
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
);
/c
切换到 cmd.exe
告诉执行命令然后终止 - 这正是您想要的。
如果您需要阻止进程直到 MySQL 进程完成,那么您可以切换到 ShellExecuteEx
。这将返回一个您可以等待的进程句柄。同样,操作起来有点困难,但可能仍然比 CreateProcess 更容易,因为这会迫使您管理管道。
关于mysql - 尝试调用 ShellExecute 来运行 Mysql 和 sql 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15031225/