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上有效。