c#System.Diagnostics.Process不执行任何操作或抛出错误
我想知道是否有人能帮我理解为什么我的c#System.Diagnostics.Process不执行任何操作或抛出错误,c#,asp.net-mvc-4,process,C#,Asp.net Mvc 4,Process,我想知道是否有人能帮我理解为什么我的进程不起作用,也不产生错误 下面的代码应该在目录中循环,找到扩展名为sqb的所有文件,并为每个文件运行一个进程,作为在服务器上具有提升权限的用户帐户 该进程应在文件所在的同一文件夹中运行可执行文件sqb2mtf.exe,例如,使用参数sqb2mtf.exe file.sqb file.bak 如果我使用Visual Studio 2013并单步执行代码,我可以看到每个文件都在循环执行,进程似乎会启动,但没有文件被转换,变量readToEndError也没有出现
进程
不起作用,也不产生错误
下面的代码应该在目录中循环,找到扩展名为sqb
的所有文件,并为每个文件运行一个进程,作为在服务器上具有提升权限的用户帐户
该进程应在文件所在的同一文件夹中运行可执行文件sqb2mtf.exe
,例如,使用参数sqb2mtf.exe file.sqb file.bak
如果我使用Visual Studio 2013并单步执行代码,我可以看到每个文件都在循环执行,进程
似乎会启动,但没有文件被转换,变量readToEndError
也没有出现任何错误
var directory = new DirectoryInfo(@"D:\inetpub\Import\");
foreach (var file in directory .EnumerateFiles("*.sqb"))
{
var convert = Path.GetFileNameWithoutExtension(file.ToString());
var process = new Process
{
StartInfo =
{
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardInput = true,
RedirectStandardError = true,
FileName = @"D:\inetpub\Import\sqb2mtf.exe",
UserName = "myUserName",
Domain = "myDomain",
Password = GetSecureString("myPassword"),
Arguments = @"D:\inetpub\Import\" + file + " " + @"D:\inetpub\Import\" + convert + ".bak"
}
};
process.Start();
string readToEndOutput = process.StandardOutput.ReadToEnd();
string readToEndError = process.StandardError.ReadToEnd();
process.WaitForExit();
}
我快疯了,任何解决这个问题的建议都将不胜感激:-)
更新
var directoryInfo = new DirectoryInfo(BackupDirectory);
foreach (var file in directoryInfo.EnumerateFiles("*.sqb"))
{
var convert = Path.GetFileNameWithoutExtension(file.ToString());
var fileName = BackupDirectory + "sqb2mtf.exe";
var arguments = "\"" + BackupDirectory + file + "\" \"" + BackupDirectory + convert + ".bak\"";
var process = new Process
{
StartInfo =
{
CreateNoWindow = true,
UseShellExecute = true,
RedirectStandardOutput = false,
RedirectStandardInput = false,
RedirectStandardError = false,
FileName = fileName,
Arguments = arguments
}
};
process.Start();
process.WaitForExit();
file.Delete();
}
从中间的InBetween
的注释中可以看出,需要引号,在本例中,引号需要围绕两个单独的文件
我可以确认这段代码在IISExpress上工作,模拟不同的用户,不幸的是不是iis7.5
解决方法是将此代码移动到控制台应用程序并安装到相关服务器上,然后使用Windows Schedule任务作为特定帐户运行。对于一些旧版应用程序,我发现我需要将参数作为引用文本传递,否则它们根本无法工作
不确定这是否是问题所在,但值得一试:
Arguments = "\"D:\\inetpub\\Import\\" + file + " D:\\inetpub\\Import\\" + convert + ".bak\"";
然而,这一过程会悄无声息地结束,这似乎很奇怪。我会仔细检查域
,用户名
和密码
,健全性检查:当您从cmd
运行命令时,它是否有效<代码>标准输出也为空?进程是否返回退出代码0或其他内容?如果所有检查结果都正常,则您在用户名
、域
或密码
等方面肯定存在一些问题。请尝试将CreateNoWindow设置为false,以便查看exe运行时发生的情况。它可能抛出一个错误或消息,你可以看到闪光过去。一旦你让它工作,你就可以隐藏窗口。如果我将CreateNoWindow设置为false,我就不会出现窗口,如果我拼写错误用户名,我会得到一个错误登录失败:未知用户名或错误密码
,因此我会正确或错误地假设,如果我没有得到这个错误,域,用户名和密码工作正常。是否需要设置WorkingDirectory
属性?某些应用程序需要从安装它们的文件夹中运行。此外,如果发生错误,Windows事件日志可能会包含一些信息。谢谢,我已经尝试将参数用引号括起来,但仍然没有乐趣。如果我拼错了用户名或密码,我会得到一个错误,但在所有详细信息都正确的情况下不会出现。我错过了内部引号,因此var arguments=“\”“+BackupDirectory+file+”\“\”“+BackupDirectory+convert+”.bak\”代码>有效,但仅在IISExpress上有效。