Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#控制台应用程序可以';t运行批处理文件,但批处理文件在命令提示符下工作正常_C#_C# 4.0_Batch File_Console Application_Batch Processing - Fatal编程技术网

C#控制台应用程序可以';t运行批处理文件,但批处理文件在命令提示符下工作正常

C#控制台应用程序可以';t运行批处理文件,但批处理文件在命令提示符下工作正常,c#,c#-4.0,batch-file,console-application,batch-processing,C#,C# 4.0,Batch File,Console Application,Batch Processing,我有一个批处理文件,如果我在命令提示符下发出这个命令,它运行得非常好 C:\app> C:\app\Process.bat C:\app\files\uploads c:\app\files file2 <- WORKS 如果我从C:\app文件夹运行批处理文件,我会看到输出文件 我想从控制台应用程序中自动执行该过程,该应用程序将被安排为作业 但是在VisualStudio调试模式下运行或单击exe文件不会产生任何效果。 我也没有任何例外 什么是错误的-许可或其他我做错的事情? 这

我有一个批处理文件,如果我在命令提示符下发出这个命令,它运行得非常好

C:\app> C:\app\Process.bat C:\app\files\uploads c:\app\files file2 <- WORKS
如果我从C:\app文件夹运行批处理文件,我会看到输出文件 我想从控制台应用程序中自动执行该过程,该应用程序将被安排为作业 但是在VisualStudio调试模式下运行或单击exe文件不会产生任何效果。 我也没有任何例外

什么是错误的-许可或其他我做错的事情?

这是C代码

这里有两个问题:

第一个问题是您需要执行cmd.exe而不是批处理文件。
第二,您正在执行它,但需要等待过程完成。你的应用程序是父进程,因为你没有等待,所以子进程没有完成

您需要发出WaitForExit():

以下是您想要做的:

static void ExecuteCommand(string command)
{
    int exitCode;
    ProcessStartInfo processInfo;
    Process process;

    processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    process = Process.Start(processInfo);
    process.WaitForExit();
    exitCode = process.ExitCode;
    process.Close();
}
要运行批处理文件,请从main()执行此操作:


你是说我不能从C代码运行xyz.bat文件?meno听起来很奇怪。你不能,批处理文件在cmd.exe的进程中运行。批处理文件有点复杂。我必须找到一个按名称调用它的解决方案,而不是直接传递大型复杂的命令。我认为您没有抓住要点,您可以执行批处理文件,但您可以通过创建一个方法来实现,就像我在回答中发布的方法一样。ExecuteCommand函数的命令参数将是批处理文件的名称。我修改了答案,告诉您该怎么做。不知道你为什么不理解这个答案。
static void Main(string[] args)
        {
            RunBatchFile(@"C:\app\Process.bat", @"C:\app\files\uploads c:\app\files 123456");
        }

public static string RunBatchFile(string fullPathToBatch, string args)
        {            
            using (var proc = new Process
            {
                StartInfo =
                {
                    Arguments = args,                    
                    FileName = fullPathToBatch,

                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardOutput = false,
                    RedirectStandardError = false
                }
            })
            {
                try
                {
                    proc.Start();
                }
                catch (Win32Exception e)
                {
                    if (e.NativeErrorCode == 2)
                    {
                        return "File not found exception";
                    }
                    else if (e.NativeErrorCode == 5)
                    {
                        return "Access Denied Exception";
                    }
                }
            }

            return "OK";
        }
var process = Process.Start(...);
process.WaitForExit();
static void ExecuteCommand(string command)
{
    int exitCode;
    ProcessStartInfo processInfo;
    Process process;

    processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    process = Process.Start(processInfo);
    process.WaitForExit();
    exitCode = process.ExitCode;
    process.Close();
}
ExecuteCommand("C:\app\Process.bat C:\app\files\uploads c:\app\files file2");