我试图通过使用ShellExecute运行mysqldump来从delphi备份我的mysql数据库。 这就是我使用mysqldump的方式:
MySqlDump.exe -u root -p[password] [databasename] > TheOutputFile.Sql
这可以从命令提示符开始。
我使用ShellExecute调用此命令行:
ShellExecute(
0,
nil,
'cmd.exe',
'C:\SmartRetail\Test System\Periodic database backup\MySqlDump.exe -u root -p123 smartretailprogramdata > TheOutputFile2.Sql',
nil,
SW_SHOW
);
这不起作用,而是打开命令提示符。 我做错了什么?
答案 0 :(得分:0)
它会打开命令解释器,因为cmd.exe
是什么。您需要指定/C
以告知cmd进程在解释您的命令后关闭。
最重要的是,您需要处理工作目录。除非.sql文件位于工作目录中,否则转储进程将无法找到它。并且工作目录是从父进程继承的,因为您没有指定它。您可能需要指定工作目录。
最后,ShellExecute
在这里确实是错误的解决方案。您只是使用它来获取stdout重定向。但这应该明确地完成。请改用CreateProcess
。
答案 1 :(得分:0)
你可以诅咒:
var
BatFile : TStringList;
str: string;
const
EXEC = 'MySqlDump.exe -u root -p[password] [databasename] > TheOutputFile.Sql' ;
begin
BatFile := TStringList.Create;
BatFile.Text := EXEC ;
str := ExtractFilePath(Application.ExeName) + 's.bat';
BatFile.SaveToFile(str);
BatFile.Free;
ShellExecuteW(Handle, 'open', PWideChar(str), nil, nil, SW_HIDE);
Sleep(200);
ShowMessage('Done.');
DeleteFile(str);
end;