我正在尝试从C#程序执行.cmd进程。当我在命令行中运行该过程时,即
C:\Directory\Process.cmd -x 1000 -y 1000 C:\Input\input.txt
我得到了一个合适的结果(在这种情况下,这意味着该进程将文件写入:
C:\Output\output.txt
但是,当我尝试从简单的C#程序运行此过程时,不会创建输出文件。以下是我的一些尝试:
尝试1)
try
{
string processName = @"C:\Directory\Process.cmd";
string argString = @" -x 1000 -y 1000 C:\Input\input.txt"; //The extra space in front of the '-x' is here on purpose
Process prs = new Process();
prs.StartInfo.UseShellExecute = false;
prs.StartInfo.RedirectStandardOutput = false;
prs.StartInfo.FileName = processName;
prs.StartInfo.Arguments = argString;
prs.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
prs.Start()
}
catch (Exception e)
{
Console.Writeline(e.Message);
}
尝试2)
try
{
System.Diagnostics.Process.Start(@"C:\\Directory\\Process.cmd", " -x 1000 -y 1000 C:\\Input\\input.txt";
}
catch (Exception e)
{
Console.Writeline(e.message);
}
现在,在这两种情况下,都不会抛出任何异常,并且会访问Process.cmd(它会在shell中打印状态更新),但该进程不会创建任何输出文件。我尝试调用Process.cmd的方式有什么问题,它直接从命令行运行时正常工作但是当我尝试从我的C#程序调用它时它无法正常工作吗?
答案 0 :(得分:2)
你呢?
System.Diagnostics.Process.Start("cmd.exe", @"/c C:\Directory\Process.cmd -x 1000 -y 1000 C:\Input\input.txt");
AFAIK,'@'预装逐字字符串,不需要反斜杠屏蔽)
答案 1 :(得分:1)
文件可能正在创建,但不是您想到的。使用
prs.StartInfo.WorkingDirectory = "yourpath"
http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx
如果UserName和Password为,则必须设置WorkingDirectory属性 提供。如果未设置该属性,则默认工作目录为 %SYSTEMROOT%\ SYSTEM32。
如果目录已经是系统路径变量的一部分,那么就可以了 不必在此属性中重复目录的位置。
当UseShellExecute时,WorkingDirectory属性的行为有所不同 是否比UseShellExecute为false时为真。当UseShellExecute是 true,WorkingDirectory属性指定的位置 可执行文件。如果WorkingDirectory是一个空字符串,则为当前 目录被理解为包含可执行文件。
当UseShellExecute为false时,不是WorkingDirectory属性 用于查找可执行文件。相反,它被进程使用 已启动,只在新流程的范围内具有意义。
我在意识到路径作为参数传入并且可能正在为其写入的文件使用硬编码路径逻辑时删除了这个,但是由于注释引用了这个,我会取消删除以防它仍然有用
答案 2 :(得分:0)
所以我终于能够了解源代码,并意识到问题出在java代码中......它将项目目录解释为输出目录。感谢您提供的所有帮助,您们提供了一些非常有用的信息!