我需要从C#代码中调用以下命令: mysql.exe --user = useranme --password = password --database = base< C:\备份\ data.sql
我用:
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = false;
process.StartInfo.FileName = "mysql.exe";
process.StartInfo.Arguments = "--user=useranme --password=password --database=base < C:\backups\data.sql";
process.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs args)
{
Console.WriteLine(args.Data);
});
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
但它不能直接进入命令行。我看到没有执行正确的部分“&lt; C:\ backups \ data.sql”。
请帮助。
答案 0 :(得分:5)
这是因为写作&lt;命令提示符下的filename强制shell在程序的标准输入中提交文件c:\ backups \ data.sql的内容。在'&lt;'之后传递部分在参数中是不正确的,因为你必须提供你的可执行文件的stdin与文件的内容。为了进行stdin / stdout重定向,你可以参考这个问题:
Redirecting stdin and stdout where stdin closes first
您将data.sql文件的内容推送到stdin流。
答案 1 :(得分:2)
我注意到的一件事,是不是你的数据库不是data.sql
,而是其他方式,第一个字母与escape sequence匹配?
您需要转义路径中的所有\
个字符,否则C#编译器会将它们视为转义序列
在您的代码中,"C:\backups"
实际上变为C:□ackups
您需要使用@
前缀字符串,告知编译器不使用转义序列,或者使用另一个\
前缀\
:
process.StartInfo.Arguments = @"--user=useranme --password=password --database=base < C:\backups\data.sql";
process.StartInfo.Arguments = "--user=useranme --password=password --database=base < C:\\backups\\data.sql";
然而,你可能只是在这里输入了一些路径而你的代码没有这个错误。
答案 2 :(得分:1)