web-dev-qa-db-ja.com

コマンドラインインターフェイスの実装に関する提案

私はコマンドラインアプリケーションを再設計していて、その使用をより直感的にする方法を探しています。コマンドラインアプリケーションに渡されるパラメーターの形式に関する規則はありますか?または、人々が役立つと思った他の方法はありますか?

36
lillq

Windowsのコマンドラインの詳細はたくさんありますが、プログラムがLinuxを対象としている場合は、 GNUコマンドライン標準 が最も直感的であることがわかります。基本的に、コマンドの長い形式にはダブルハイフンを使用します(例:--help)および短いバージョンの単一のハイフン(例:-h)。短いバージョンを一緒に「スタック」することもできます(例:tar -zxvffilename)とミックス 'nは、心ゆくまで長く、短くマッチします。

GNUサイトには 標準オプション名 もリストされています。

getopt library は、これらのコマンドの解析を大幅に簡素化します。 Cがあなたのバッグでない場合、 Python には、 Perl と同様のライブラリがあります。

29
yukondude

C#try Mono.GetOptions を使用している場合、これは非常に強力で使いやすいコマンドライン引数パーサーです。これは、Mono環境およびMicrosoft .NETFrameworkで機能します。

編集:ここにいくつかの機能があります

  • 各パラメータには2つのCLI表現があります(1文字と文字列、例:-aまたは--add)
  • デフォルト値
  • 強いタイプ
  • 指示を含むヘルプ画面を自動的に生成します
  • バージョンと著作権画面を自動的に生成します
14
Sklivvz

特定のCLIについて私が気に入っていることの1つは、ショートカットの使用法です。
つまり、次のすべての行は同じことをしています

myCli.exe describe someThing
myCli.exe descr someThing
myCli.exe desc someThing

そうすれば、ユーザーは毎回allコマンドを入力する必要がなくなる可能性があります。

4
VonC

良い参考資料:

https://commandline.codeplex.com/

NuGet経由で利用可能なライブラリ:

  1. 最新の安定版:_Install-Package CommandLineParser_。
  2. 最新リリース:_Install-Package CommandLineParser -pre_。

デフォルトのシングルトンを使用した1行の解析:CommandLine.Parser.Default.ParseArguments(...)
1行のヘルプ画面ジェネレーター:HelpText.AutoBuild(...)
コマンドライン引数を_IList<string>_、配列、列挙型、または標準のスカラー型にマップします。
ここで説明されているプラ​​グインフレンドリーなアーキテクチャ。
動詞コマンドを_git commit -a_として定義します。
ラムダ式を使用してパーサーインスタンスを作成します。

クイックスタート: https://commandline.codeplex.com/wikipage?title=Quickstart&referringTitle=Documentation

_// Define a class to receive parsed values
class Options {
  [Option('r', "read", Required = true,
    HelpText = "Input file to be processed.")]
  public string InputFile { get; set; }

  [Option('v', "verbose", DefaultValue = true,
    HelpText = "Prints all messages to standard output.")]
  public bool Verbose { get; set; }

  [ParserState]
  public IParserState LastParserState { get; set; }

  [HelpOption]
  public string GetUsage() {
    return HelpText.AutoBuild(this,
      (HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
  }
}

// Consume them
static void Main(string[] args) {
  var options = new Options();
  if (CommandLine.Parser.Default.ParseArguments(args, options)) {
    // Values are available here
    if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile);
  }
}
_
4
Kiquenet

最善の方法は、可能であれば何も想定しないことです。オペレーターが実行するアプリケーション名を入力し、パラメーターがない場合は、USAGEブロックでそれらをヒットするか、代わりにWindowsフォームを開いて必要なものすべてを入力できるようにします。

c:\>FOO

FOO

USAGE FOO -{Option}{Value}

-A Do A stuff
-B Do B stuff

c:\>

宗教的なトピックの見出しの下に配置するパラメーターの区切り:ハイフン(ダッシュ)、ダブルハイフン、スラッシュ、なし、位置など。

プラットフォームを指定していませんが、次のコメントではWindowsと.netを想定します

.netでコンソールベースのアプリケーションを作成し、コンソールベースのプロジェクトを選択してWindows.Forms、System.DrawingなどのDLLを追加するだけで、フォームを使用してデスクトップと対話できるようにすることができます。

私たちはいつもこれを行っています。これにより、暗い路地を曲がる人がいないことが保証されます。

3
Bill

これがあなたを助けるかもしれないCodeProjectの記事です...

C#/。NETコマンドライン引数パーサー

IF VBがあなたの味です、ここにチェックアウトするための別の記事(もう少しガイダンス関連のコンテンツがあります)があります...

VB.NETを使用したコマンドラインパラメーターの解析と検証

3
Sean Gough

コマンドラインの規則はOSによって異なりますが、おそらく最もよく使用され、最も一般的に精査されている規則は、GNU getoptパッケージでサポートされている規則です。を参照してください。詳細については、_ http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html を参照してください。

これにより、-nrなどの1文字のコマンドと、-numeric--reverseなどのより長い自己文書化オプションを組み合わせることができます。ニースになり、-help(-?)オプションを実装すると、ユーザーは知る必要のあるすべてを理解できるようになります。

3
Kimbo

@voncの回答を補完するものとして、あいまいな略語を受け入れないでください。例えば:

  myCli.exe describe someThing
  myCli.exe destroy someThing
  myCli.exe des someThing ???

実際、その場合、私はおそらく「破壊」の略語を受け入れないでしょう...

3

私はいつも/?を追加しますヘルプを得るためのパラメータと私は常にデフォルト(つまり最も一般的なシナリオ)の実装をしようとします。

それ以外の場合は、スイッチに「/ x」を使用し、値を渡す必要があるスイッチに「/ x:value」を使用する傾向があります。正規表現を使用してパラメーターを解析するのが非常に簡単になります。

2
Sean Gough

私はこのフレームワークを開発しました、多分それは助けになります:

SysCommandは、.NETでコンソールアプリケーションを開発するための強力なクロスプラットフォームフレームワークです。シンプルでタイプセーフであり、MVCパターンの影響を大きく受けます。

https://github.com/juniorgasparotto/SysCommand

namespace Example.Initialization.Simple
{
    using SysCommand.ConsoleApp;

    public class Program
    {
        public static int Main(string[] args)
        {
            return App.RunApplication();
        }
    }

    // Classes inheriting from `Command` will be automatically found by the system
    // and its public properties and methods will be available for use.
    public class MyCommand : Command
    {
        public void Main(string arg1, int? arg2 = null)
        {
            if (arg1 != null)
                this.App.Console.Write(string.Format("Main arg1='{0}'", arg1));
            if (arg2 != null)
                this.App.Console.Write(string.Format("Main arg2='{0}'", arg2));
        }

        public void MyAction(bool a)
        {
            this.App.Console.Write(string.Format("MyAction a='{0}'", a));
        }
    }
}

テスト:

// auto-generate help
$ my-app.exe help

// method "Main" typed
$ my-app.exe --arg1 value --arg2 1000

// or without "--arg2"
$ my-app.exe --arg1 value

// actions support
$ my-app.exe my-action -a
1
Junior

Perlを使用している場合、私の CLI :: Application フレームワークがまさに必要なものかもしれません。これにより、SVN/CVS/GITのようなユーザーインターフェイスを使用してアプリケーションを簡単に構築できます(「your-command-o --long-opt some-action-to-execute someparameters」)。

0
jkramer

コマンドラインパーサーを含む.NetC#ライブラリを作成しました。 CmdLineObjectクラスを継承するクラスを作成し、Initializeを呼び出すだけで、プロパティが自動的に入力されます。さまざまなタイプへの変換(プロジェクトに含まれている高度な変換ライブラリを使用)、配列、コマンドラインエイリアス、クリックワンス引数などを処理できます。コマンドラインヘルプ(/?)も自動的に作成します。

興味がある場合、プロジェクトのURLは http://bizark.codeplex.com です。現在、ソースコードとしてのみ入手可能です。

0
Brian

-操作[パラメータ]-コマンド[あなたのコマンド] -anotherthings [otherparams]..。

例えば、

YourApp.exe -file %YourProject.prj% -Secure true
0
Graviton

Getoptsなどのコマンドラインインターフェイスを生成するための標準ツールの1つを使用する場合は、自動的に準拠します。

0
jodonnell

アプリケーションに使用する規則は、

1)それがどのような種類のアプリケーションであるか。
2)使用しているオペレーティングシステム。 Linux?ウィンドウズ?それらは両方とも異なる規則を持っています。

私が提案するのは、渡されたパラメーターに特別な注意を払いながら、システム上の他のコマンドの他のコマンドラインインターフェイスを調べることです。パラメータが正しくない場合、ユーザーソリューションに指示されたエラーメッセージが表示されます。見つけやすいヘルプ画面は、使いやすさにも役立ちます。

アプリケーションが何をするのかを正確に知らなければ、具体的な例を示すのは困難です。

0
Alan H

さらに優れたコマンドラインパーサーをリリースしました。
https://github.com/gene-l-thomas/coptions
nugetにありますInstall-Package coptions

using System;
using System.Collections.Generic;
using coptions;

[ApplicationInfo(Help = "This program does something useful.")]
public class Options
{
    [Flag('s', "silent", Help = "Produce no output.")]
    public bool Silent;

    [Option('n', "name", "NAME", Help = "Name of user.")]
    public string Name
    {
        get { return _name;  }
        set { if (String.IsNullOrWhiteSpace(value))
                throw new InvalidOptionValueException("Name must not be blank");
              _name = value;
        }
    }
    private string _name;

    [Option("size", Help = "Size to output.")]
    public int Size = 3;

    [Option('i', "ignore", "FILENAME", Help = "Files to ignore.")]
    public List<string> Ignore;

    [Flag('v', "verbose", Help = "Increase the amount of output.")]
    public int Verbose = 1;

    [Value("OUT", Help = "Output file.")]
    public string OutputFile;

    [Value("INPUT", Help = "Input files.")]
    public List<string> InputFiles;
}

namespace coptions.ReadmeExample
{
    class Program
    {
        static int Main(string[] args)
        {
            try
            {
                Options opt = CliParser.Parse<Options>(args);

                Console.WriteLine(opt.Silent);
                Console.WriteLine(opt.OutputFile);
                return 0;
            }
            catch (CliParserExit)
            {
                // --help
                return 0;

            } catch (Exception e)
            {
                // unknown options etc...
                Console.Error.WriteLine("Fatal Error: " + e.Message);
                return 1;
            }
        }
    }
}

自動--help生成、動詞をサポートします。 commmand.exe
楽しい。

0
user3373555

アプリケーションに使用する規則は、

1)それがどのような種類のアプリケーションであるか。 2)使用しているオペレーティングシステム。

これは間違いなく真実です。 dos-Promptの規則についてはよくわかりませんが、unixライクなシステムでは、一般的な規則は大まかに次のようになります。

1)フォーマットは

appNameパラメーター

2)単一文字パラメーター(「x」など)は-xとして渡されます3)複数文字パラメーター(「add-keys」など)は--add-keysとして渡されます

0
donair