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 は 'Create databasename' に削除されました。

コマンド ウィンドウが短時間開き、いくつかのメッセージがスクロールされます。速すぎて読むことができません。コマンド ウィンドウを開いて同じプログラムとコマンドラインを入力すると、機能します。失敗したときのエラー メッセージが表示されません。

Windows 7 デスクトップでローカルに実行しています。出力をログ ファイルに送信しようとしましたが、ファイルをバッチで取得することすらできません。対話的に成功した場合、ログを取得します。考えられるすべての調整を試しました。

続行する方法についてのアイデアをいただければ幸いです。

4

1 に答える 1

4

コマンドプロンプトでまったく同じコマンドが機能すると言ったとき、あなたはそれを自分で言いました。違いは、コマンド インタープリターの存在ですcmd.exe。これにより、入力ファイルを MySQL プロセスにパイプするパイプが作成されます。

この問題には 2 つの明白な解決策があります。

  1. CreateProcessプロセスを開始し、自分でパイプをセットアップするために使用します。これは少し低レベルであり、かなりの量の Win32 ボイラープレートが含まれます。必要に応じて、プロセスが完了するまでブロックするのが少し簡単になります。
  2. ShellExecute呼び出して、MySQLを実行するようにcmd.exe依頼し、パイプを整理します。cmd.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 に答える