1

我一直在尝试在 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 桌面上本地运行。我尝试将输出定向到日志文件,但我什至没有批量获取该文件。当它以交互方式成功时,我会得到一个日志。我已经尝试了所有我能想到的调整。

任何关于如何进行的想法将不胜感激。

4

1 回答 1

4

当您说完全相同的命令在命令提示符下工作时,您自己说过。不同之处在于命令解释器的存在,cmd.exe. 这对您所做的是创建将输入文件通过管道传输到 MySQL 进程的管道。

您有两个明显的解决方案:

  1. 用于CreateProcess启动流程并自行设置管道。这有点低级,涉及相当多的 Win32 样板。如果您需要这样做,它确实使在该过程完成之前阻塞变得更简单一些。
  2. 调用并要求ShellExecute运行MySQL 并整理管道。cmd.execmd.exe

选项 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这迫使您管理管道更容易。

于 2013-02-22T19:13:09.860 回答