【问题标题】:C# running external batch and java fileC#运行外部批处理和java文件
【发布时间】:2013-03-27 20:38:56
【问题描述】:

我正在使用 Stanford POS-tagger 应用程序在大约 300 个文件中标记一些文章。为此,我编写了一个 C# 代码,它将遍历文件并使用标记器。

我的代码如下所示:

Process thisProcess=new Process();
thisProcess.StartInfo.CreateNoWindow=true;
thisProcess.StartInfo.WindowStyle=ProcessWindowStyle.Hidden;
thisProcess.StartInfo.WorkingDirectory=@"C:\postagger";
thisProcess.StartInfo.FileName=@"C:\postagger\stanford-postagger.bat";
thisProcess.StartInfo.UseShellExecute=false;
thisProcess.StartInfo.RedirectStandardOutput=true;

if(Directory.Exists(@"C:\brown2")) {
    DirectoryInfo brown=new DirectoryInfo(@"C:\brown2");
    DirectoryInfo brownParsed;

    if(!Directory.Exists(@"C:\brown-parsed"))
        brownParsed=Directory.CreateDirectory(@"C:\brown-parsed");
    else
        brownParsed=new DirectoryInfo(@"C:\brown-parsed");

    FileInfo[] files=brown.GetFiles();

    foreach(FileInfo f in files) {

        Console.WriteLine("Parsing file "+f.Name+" ...");
        thisProcess.StartInfo.Arguments=@"C:\postagger\models\wsj-0-18-bidirectional-distsim.tagger "+f.FullName;
        //Console.WriteLine(thisProcess.StartInfo.Arguments);
        thisProcess.Start();
        thisProcess.WaitForExit();
        //Console.Read();
        StreamWriter sw=new StreamWriter(Path.Combine(brownParsed.FullName, f.Name), false);
        string output=thisProcess.StandardOutput.ReadToEnd();
        //sw.Write(thisProcess.StandardOutput.ReadToEnd());
        sw.Write(output);
        sw.Flush();
        sw.Close();
        //Console.WriteLine("File {0} done!",f.Name);
        Console.WriteLine(output);
    }
}
else
    Console.WriteLine("Dir not found!");

Console.Read();

stanford-postagger.bat 看起来像这样:

用法:stanford-postagger 模型文本文件 例如,stanford-postagger models\left3words-wsj-0-18.tagger sample-input.txt

java -mx300m -cp "stanford-postagger.jar;" edu.stanford.nlp.tagger.maxent.MaxentTagger -model %1 -textFile %2

问题是:

代码会运行它,但它会不运行 java 命令。我在我的笔记本电脑上试过了,它就像一个魅力,它标签。但由于内存不足,它不会标记大文件。但是在我更强大的PC上,它不会运行java。

如果我打开 CMD 并输入带有文件正确参数的 java 命令,它就可以工作。有什么可能导致它不起作用的想法吗?所有的路径都很好,我检查了三次。

这是我从非工作程序(在我的 PC 上)获得的输出示例:

C:\postagger>java -mx300m -cp "stanford-postagger.jar;" edu.stanford.nlp.tagger.maxent.MaxentTagger -model C:\postagger\models\wsj-0-18-bidirectional-distim.tagger -textFile C:\brown2\aaa.txt

【问题讨论】:

  • 笔记本和台式机是同一个位操作系统吗?

标签: c# .net pos-tagger


【解决方案1】:

我不能 100% 确定使用它运行批处理文件,但也许使用 Process 来执行它?

var process = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "path-to-file.bat"
            }
        };
        process.Start();
        process.WaitForExit();

【讨论】:

  • 不是bat文件执行,有效,批处理文件自己执行,但是java的事情不会继续
  • 在普通命令行 (cmd.exe) 中键入“java -version”会发生什么?
  • 它有效。有趣的是,如果我从 CMD 运行它,它就可以工作。如果我在我的 cmd 中输入“java -version”,它会显示我的 java 版本,1.7.0_17。但是,我将批处理文件而不是“此处的 java 参数”更改为“此处的“C:\Program Files\Java\jdk1.7.0_17\bin\java”参数”并且它有效。奇怪的东西:)
  • "java" 是一个环境变量,无论如何它只会执行那个确切的文件。我不相信环境变量是特定于用户的,但也许这可能是一个问题?不过至少解决了。
猜你喜欢
  • 1970-01-01
  • 2023-01-11
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
相关资源
最近更新 更多