6

MSDNを使用して、コマンドラインツールのラッパーを作成するクラスを取得しました。

私は今問題に直面しています。引数を指定してコマンドラインからexeを実行すると、エラーなしで完全に機能します。

しかし、ラッパーから引数を渡そうとすると、プログラムがクラッシュします。

私が議論を適切に受け渡しているかどうか、そして私が間違っているかどうかを知りたいと思ったので、誰かが指摘してください。これはMSDNのLaunchEXEクラスです

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.IO;

namespace SPDB
{
    /// <summary>
    /// Class to run any external command line tool with arguments
    /// </summary>
    public class LaunchEXE
    {
        internal static string Run(string exeName, string argsLine, int timeoutSeconds)
        {
            StreamReader outputStream = StreamReader.Null;
            string output = "";
            bool success = false;

            try
            {
                Process newProcess = new Process();
                newProcess.StartInfo.FileName = exeName;
                newProcess.StartInfo.Arguments = argsLine;
                newProcess.StartInfo.UseShellExecute = false;
                newProcess.StartInfo.CreateNoWindow = true; //The command line is supressed to keep the process in the background
                newProcess.StartInfo.RedirectStandardOutput = true;
                newProcess.Start();
                if (0 == timeoutSeconds)
                {
                    outputStream = newProcess.StandardOutput;
                    output = outputStream.ReadToEnd();
                    newProcess.WaitForExit();
                }
                else
                {
                    success = newProcess.WaitForExit(timeoutSeconds * 1000);

                    if (success)
                    {
                        outputStream = newProcess.StandardOutput;
                        output = outputStream.ReadToEnd();
                    }
                    else
                    {
                        output = "Timed out at " + timeoutSeconds + " seconds waiting for " + exeName + " to exit.";
                    }
                }
            }
            catch (Exception e)
            {
                throw (new Exception("An error occurred running " + exeName + ".", e));
            }
            finally
            {
                outputStream.Close();
            }

            return "\t" + output;           

        }
    }
}

これは、メインプログラム(Form1.cs)から引数を渡す方法です。

private void button1_Click(object sender, EventArgs e)
        {
            string output;
            output = LaunchEXE.Run(@"C:\Program Files (x86)\MyFolder\MyConsole.exe", "/BACKUP C:\\MyBackupProfile.txt", 100);
            System.Windows.Forms.MessageBox.Show(output);
        }

コマンドラインツールは次のコマンドを受け入れ、完全に機能します。

C:\ Program Files(x86)\ MyFolder> MyConsole.exe / BACKUP C:\ MyBackupProfile.txt

4

2 に答える 2

2

2 つのオプションがあります -

1) Visual Studio を「管理者モード」で実行してみてください。または 2) 代わりにこれを実装してみてください。https://github.com/commandlineparser/commandline .

「コマンド ライン パーサー ライブラリは、コマンド ライン引数と関連タスクを操作するためのクリーンで簡潔な API を CLR アプリケーションに提供します。これにより、高度なカスタマイズと構文エラーをユーザーに報告する簡単な方法でヘルプ画面を表示できます。退屈で反復的なプログラミングはすべてライブラリの肩にかかっているため、コア ロジックに集中できます。このライブラリは、2005 年以来、絶えず更新されている API を使用して、手間のかからないコマンド ライン解析を提供します。」

私にとってはうまくいきました。

于 2013-03-12T16:06:56.707 に答える
0

あなたの道のスペースが気に入らない気がします。この投稿を参照してください:C#ディレクトリホワイトスペースをprocess.arguementsに使用する方法は?

于 2013-03-12T14:33:27.117 に答える