如何允许c#进程像在命令行上运行一样创建文件?

本文关键字:一样 创建 文件 运行 进程 何允许 命令行 | 更新日期: 2023-09-27 18:10:47

我正试图执行一个进程,就像它在窗口的命令行上执行一样,但进程类不允许可执行文件创建一个类似于它从命令行运行时会做的事情。这些流程在部署时将以一定的时间间隔在服务器上异步运行。命令行将调用如下所示:

curl.exe url -o data

wgrib2.exe data -csv output.csv

在下面的代码中,我发现了一个解决curl.exe的方法,但是当它被读取为StandardOutput时,该文件会切断该文件类型的一些关键停止字符。

public static void httpQuery(string queryString)
{
    Process myProcess = new Process();
    try
    {
        string basepath = AppDomain.CurrentDomain.BaseDirectory;
        myProcess.StartInfo.UseShellExecute = false;            // allows us to redirect the output
        myProcess.StartInfo.CreateNoWindow = true;              // stop's command window from being made
        myProcess.StartInfo.Verb = "runas";
        myProcess.StartInfo.FileName = @"C:'Users'Ian's'Desktop'wgrib2'curl.exe";
        myProcess.StartInfo.Arguments = queryString;            // queryString is http://nomads.noaa.gov/....
        myProcess.StartInfo.RedirectStandardError = true;       // redirect error to stream reader
        myProcess.StartInfo.RedirectStandardOutput = true;      // redirect output to strem reader
        myProcess.Start();
        if (myProcess.WaitForExit(10000) == false)
        {
            myProcess.Kill();
        }
        using(StreamReader reader = myProcess.StandardError)    // capture error output if any
        {
            string result = reader.ReadToEnd();                 
            reader.Close();
            StreamReader message = myProcess.StandardOutput;
            string output = message.ReadToEnd();
            StreamWriter writer = new StreamWriter(basepath + "wgrib2''data");
            writer.Write(output);
            writer.Close();
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
    myProcess.Close();
}

另外,我似乎找不到允许第二个进程写入新文件的方法,或者如果已经找到了,我找不到它正在写入的目录。我在IIS开发服务器上使用VS2012。这是第二个进程代码。

public static void callWgrib2()
    {
        Process wgrib2 = new Process();
        try
        {
            // call on command line: wgrib2.exe data -csv data.csv
            string basepath = AppDomain.CurrentDomain.BaseDirectory;            // path to project directory
            string arg1 = basepath + "wgrib2''data";                            // filename of operate on
            string arg2 =" -csv " + basepath + "wgrib2''data.csv";              // filename to write to
            wgrib2.StartInfo.UseShellExecute = false;                           // parameters
            wgrib2.StartInfo.CreateNoWindow = true;
            wgrib2.StartInfo.Verb = "runas";
            wgrib2.StartInfo.FileName = @"C:'Users'Ian's'Desktop'wgrib2'wgrib2.exe";
            wgrib2.StartInfo.Arguments = "'""+ arg1 + arg2 + "'"";
            wgrib2.StartInfo.RedirectStandardError = true;
            wgrib2.Start();
            if (wgrib2.WaitForExit(10000) == false)
            {
                wgrib2.Kill();
            }
            using (StreamReader reader = wgrib2.StandardOutput)
            {
                string result = reader.ReadToEnd();
                reader.Close();
                StreamReader err = wgrib2.StandardError;
                err.ReadToEnd();
                err.Close();
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        wgrib2.Close();
    }
我已经在这个问题上付出了相当大的努力,但我确信存在一个简单的解决方法,我没有意识到。

如何允许c#进程像在命令行上运行一样创建文件?

如果您想使用实际的命令行过程,您可以使用cmd并在参数

中将/c标志传递给它

也行

wgrib2.StartInfo.Arguments = "'""+ arg1 + arg2 + "'"";

看起来很奇怪

你真的需要你所有的参数,如-csv是在同一个引号块?

就像在命令行上调用

C:'Users'Ian's'Desktop'wgrib2'wgrib2.exe "c:'base'wgrib2'data -csv c:'base'wgrib2'data.csv"
相关文章: