0

我正在尝试从 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# 程序调用它时它不能正常工作?

4

3 回答 3

2

你这个?

System.Diagnostics.Process.Start("cmd.exe", @"/c C:\Directory\Process.cmd -x 1000 -y 1000 C:\Input\input.txt");

AFAIK,'@' 前置逐字字符串,不需要反斜杠掩码)

于 2012-06-06T21:58:03.340 回答
1

该文件可能正在创建,但不是您认为的。采用

prs.StartInfo.WorkingDirectory = "yourpath"

http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.workingdirectory.aspx

如果提供了 UserName 和 Password,则必须设置 WorkingDirectory 属性。如果未设置该属性,则默认工作目录为 %SYSTEMROOT%\system32。

如果目录已经是系统路径变量的一部分,则不必在此属性中重复目录的位置。

当 UseShellExecute 为 true 时,WorkingDirectory 属性的行为与 UseShellExecute 为 false 时不同。当 UseShellExecute 为 true 时,WorkingDirectory 属性指定可执行文件的位置。如果 WorkingDirectory 是一个空字符串,则当前目录被理解为包含可执行文件。

当 UseShellExecute 为 false 时,WorkingDirectory 属性不用于查找可执行文件。相反,它由已启动的进程使用,并且仅在新进程的上下文中才有意义。

在意识到路径作为参数传入并且可能对它写入的文件使用硬编码的路径逻辑后,我删除了它,但由于评论引用了它,我将取消删除以防它仍然有帮助。

于 2012-06-06T21:42:04.080 回答
0

所以我终于能够拿到源代码,并意识到问题出在java代码中......它将项目目录解释为输出目录。谢谢大家的帮助,你们提供了一些非常有用的信息!

于 2012-06-07T12:47:31.597 回答