我有这个应该运行shell命令的函数。 这就是我所说的:
RunCommand("C:\\source\\in\\DSC00749.jpg -gravity Center -crop 100x100+0+0 -write C:\\source\\out\\DSC00749.jpg");
private static string RunCommand(string cmd)
{
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
string strErrMsg = "OK";
try
{
ProcessStartInfo procInfo = new ProcessStartInfo("convert.exe");
procInfo.CreateNoWindow = true;
procInfo.UseShellExecute = true;
procInfo.Arguments = cmd;
Process.Start(procInfo);
}
catch (Win32Exception e)
{
if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
{
strErrMsg = "File not found exception";
}
else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
{
strErrMsg = "Access Denied Exception";
}
}
return strErrMsg;
}
如果我在命令shell中运行它,它可以工作:
convert.exe C:\\source\\in\DSC00749.jpg -gravity Center -crop 100x100+0+0-write C:\\source\\out\\DSC00749.jpg
如果我在调试中运行更多或直接运行它,它就不会创建图像。
我的代码出了什么问题?我是以正确的方式做到的吗?
答案 0 :(得分:1)
你错过了反斜杠: C:\\source\\in\\DSC00749.jpg
为了避免进一步的错误,如果字符串包含反斜杠,请在字符串前加 @
。示例:@"My Path\My Filename"
此外,您似乎只是通过处理某些类型的异常来“吞噬”某些Win32Exception
。您应该在catch块的末尾包含throw;
以重新抛出您未处理的Win32Exception
。它可能是一个不同的Win32Exception,既不报告“找不到文件”也不报告“拒绝访问”。
答案 1 :(得分:1)
请记住,这是与您的代码异步运行的,因此Process.Start
调用将立即返回。如果您之后致电WaitForExit()
会怎样?
此外,我不确定您为何使用mvc-3标记此内容,但如果您是从网络应用程序运行此功能,则需要确保您有权这样做。
答案 2 :(得分:1)
您是否拥有convert.exe的完整路径?
尝试一下,看看它是否有效,因为你没有得到任何例外。