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");