İngilizce dilinde oku

Aracılığıyla paylaş


Öğretici: System.CommandLine kullanmaya başlama

Önemli

System.CommandLine şu anda ÖNİzLEME aşamasındadır ve bu belge 2.0 beta 4 sürümüne yöneliktir. Bazı bilgiler, yayımlanmadan önce önemli ölçüde değiştirilebilen yayın öncesi ürünle ilgilidir. Microsoft, burada sağlanan bilgilerle ilgili olarak açık veya zımni hiçbir garanti vermez.

Bu öğreticide, System.CommandLine kitaplığını kullanan bir .NET komut satırı uygulamasının nasıl oluşturulacağı gösterilmektedir. İlk olarak tek bir seçeneği olan basit bir kök komutu oluşturacaksınız. Ardından bu temele ekleyerek birden çok alt komut ve her komut için farklı seçenekler içeren daha karmaşık bir uygulama oluşturacaksınız.

Bu öğreticide aşağıdakilerin nasıl yapılacağını öğreneceksiniz:

  • Komutlar, seçenekler ve bağımsız değişkenler oluşturun.
  • Seçenekler için varsayılan değerleri belirtin.
  • Komutlara seçenekler ve bağımsız değişkenler atayın.
  • Komut altındaki tüm alt komutlara özyinelemeli olarak bir seçenek atayın.
  • Birden fazla katmanlı iç içe geçmiş alt komutlarla çalışma.
  • Komutlar ve seçenekler için diğer adlar oluşturun.
  • string, string[], int, bool, FileInfo ve enum seçenek türleriyle çalışın.
  • Seçenek değerlerini komut işleyici koduna bağlayın.
  • Seçenekleri ayrıştırma ve doğrulama için özel kod kullanın.

Önkoşullar

Veya

Uygulamayı oluşturma

"scl" adlı bir .NET 6 konsol uygulaması projesi oluşturun.

  1. Proje için scl adlı bir klasör oluşturun ve ardından yeni klasörde bir komut istemi açın.

  2. Aşağıdaki komutu çalıştırın:

    dotnet new console --framework net6.0
    

System.CommandLine paketini yükleme

  • Aşağıdaki komutu çalıştırın:

    dotnet package add System.CommandLine --prerelease
    

    Kitaplık hala beta sürümünde olduğundan --prerelease seçeneği gereklidir.

  1. Program.cs dosyasının içeriğini aşağıdaki kodla değiştirin:

    using System.CommandLine;
    
    namespace scl;
    
    class Program
    {
        static async Task<int> Main(string[] args)
        {
            var fileOption = new Option<FileInfo?>(
                name: "--file",
                description: "The file to read and display on the console.");
    
            var rootCommand = new RootCommand("Sample app for System.CommandLine");
            rootCommand.AddOption(fileOption);
    
            rootCommand.SetHandler((file) => 
                { 
                    ReadFile(file!); 
                },
                fileOption);
    
            return await rootCommand.InvokeAsync(args);
        }
    
        static void ReadFile(FileInfo file)
        {
            File.ReadLines(file.FullName).ToList()
                .ForEach(line => Console.WriteLine(line));
        }
    }
    

Önceki kod:

  • FileInfo türünde --file adlı bir seçeneği oluşturur ve kök komutuna atar:

    var fileOption = new Option<FileInfo?>(
        name: "--file",
        description: "The file to read and display on the console.");
    
    var rootCommand = new RootCommand("Sample app for System.CommandLine");
    rootCommand.AddOption(fileOption);
    
  • kök komutu çağrıldığında çağrılacak yöntemin ReadFile olduğunu belirtir:

    rootCommand.SetHandler((file) => 
        { 
            ReadFile(file!); 
        },
        fileOption);
    
  • Kök komut çağrıldığında belirtilen dosyanın içeriğini görüntüler:

    static void ReadFile(FileInfo file)
    {
        File.ReadLines(file.FullName).ToList()
            .ForEach(line => Console.WriteLine(line));
    }
    

Uygulamayı test edin

Komut satırı uygulaması geliştirirken test etmek için aşağıdaki yollardan herhangi birini kullanabilirsiniz:

  • dotnet build komutunu çalıştırın ve yürütülebilir dosyayı çalıştırmak için scl/bin/Debug/net6.0 klasöründe bir komut istemi açın:

    dotnet build
    cd bin/Debug/net6.0
    scl --file scl.runtimeconfig.json
    
  • Aşağıdaki örnekte olduğu gibi dotnet run kullanın ve seçenek değerlerini --sonrasına ekleyerek run komutu yerine uygulamaya geçirin:

    dotnet run -- --file bin/Debug/net6.0/scl.runtimeconfig.json
    

Çalışma dizini proje klasörüdür (.csproj dosyasını içeren klasör), bu nedenle scl.runtimeconfig.json göreli yolu proje klasöründendir.

.NET 7.0.100 SDK Önizlemesi'nde, dotnet run --launch-profile <profilename>komutunu çalıştırarak bir launchSettings.json dosyasının commandLineArgs kullanabilirsiniz.

  • Projeyibir klasörde yayımlayın, bu klasöre bir komut istemi açın ve yürütülebilir dosyayı çalıştırın:

    dotnet publish -o publish
    cd ./publish
    scl --file scl.runtimeconfig.json
    
  • Visual Studio 2022'de menüden Hata Ayıklama>Hata Ayıklama Özellikleri seçin ve Komut satırı bağımsız değişkenleri kutusuna seçenekleri ve bağımsız değişkenleri girin. Örneğin:

    Visual Studio 2022'deki Komut satırı bağımsız değişkenleri

    Ardından, örneğin Ctrl+F5 tuşlarına basarak uygulamayı çalıştırın.

Bu öğreticide, bu seçeneklerden ilkini kullandığınız varsayılır.

Uygulamayı çalıştırdığınızda, --file seçeneği tarafından belirtilen dosyanın içeriğini görüntüler.

{
  "runtimeOptions": {
    "tfm": "net6.0",
    "framework": {
      "name": "Microsoft.NETCore.App",
      "version": "6.0.0"
    }
  }
}

Yardım çıktısı

System.CommandLine otomatik olarak yardım çıkışı sağlar:

scl --help
Description:
  Sample app for System.CommandLine

Usage:
  scl [options]

Options:
  --file <file>   The file to read and display on the console.
  --version       Show version information
  -?, -h, --help  Show help and usage information

Sürüm çıkışı

System.CommandLine otomatik olarak sürüm çıkışı sağlar:

scl --version
1.0.0

Alt komut ve seçenekler ekleme

Bu bölümde, şunları yapacaksınız:

  • Daha fazla seçenek oluşturun.
  • Bir alt komut oluşturun.
  • Yeni seçenekleri yeni alt komutlara atayın.

Yeni seçenekler ön plan ve arka plan metin renklerini ve okuma hızını yapılandırmanıza olanak sağlar. Bu özellikler, Teleprompter konsol uygulaması öğreticisindengelen bir alıntı koleksiyonunu okumak için kullanılacaktır.

  1. Bu örneğin GitHub deposundaki sampleQuotes.txt dosyasını proje dizininize kopyalayın. Dosyaları indirme hakkında bilgi için Örnekler ve Öğreticileryönergelerine bakın.

  2. Proje dosyasını açın ve kapanış </Project> etiketinden hemen önce bir <ItemGroup> öğesi ekleyin:

    <ItemGroup>
      <Content Include="sampleQuotes.txt">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      </Content>
    </ItemGroup>
    

    Bu işaretlemenin eklenmesi, uygulamayı oluştururken metin dosyasının kutusu/debug/net6.0 klasörüne kopyalanmasına neden olur. Bu nedenle yürütülebilir dosyayı bu klasörde çalıştırdığınızda, klasör yolu belirtmeden dosyaya ada göre erişebilirsiniz.

  3. Program.csiçinde, --file seçeneğini oluşturan koddan sonra, okuma hızını ve metin renklerini denetlemek için seçenekler oluşturun:

    var delayOption = new Option<int>(
        name: "--delay",
        description: "Delay between lines, specified as milliseconds per character in a line.",
        getDefaultValue: () => 42);
    
    var fgcolorOption = new Option<ConsoleColor>(
        name: "--fgcolor",
        description: "Foreground color of text displayed on the console.",
        getDefaultValue: () => ConsoleColor.White);
    
    var lightModeOption = new Option<bool>(
        name: "--light-mode",
        description: "Background color of text displayed on the console: default is black, light mode is white.");
    
  4. Kök komutu oluşturan satırdan sonra, --file seçeneğini ekleyen satırı silin. Burada kaldırıyorsunuz çünkü yeni bir alt komuta ekleyeceksiniz.

    var rootCommand = new RootCommand("Sample app for System.CommandLine");
    //rootCommand.AddOption(fileOption);
    
  5. Kök komutu oluşturan satırdan sonra bir read alt komutu oluşturun. Bu alt komuta seçenekleri ekleyin ve alt komutu kök komutuna ekleyin.

    var readCommand = new Command("read", "Read and display the file.")
        {
            fileOption,
            delayOption,
            fgcolorOption,
            lightModeOption
        };
    rootCommand.AddCommand(readCommand);
    
  6. SetHandler kodunu yeni alt komut için aşağıdaki SetHandler koduyla değiştirin:

    readCommand.SetHandler(async (file, delay, fgcolor, lightMode) =>
        {
            await ReadFile(file!, delay, fgcolor, lightMode);
        },
        fileOption, delayOption, fgcolorOption, lightModeOption);
    

    Artık kök komutta SetHandler çağırmıyorsunuz çünkü kök komutun artık bir işleyiciye ihtiyacı yok. Bir komutun alt komutları olduğunda, genellikle bir komut satırı uygulaması çağrılırken alt komutlardan birini belirtmeniz gerekir.

  7. ReadFile işleyici yöntemini aşağıdaki kodla değiştirin:

    internal static async Task ReadFile(
            FileInfo file, int delay, ConsoleColor fgColor, bool lightMode)
    {
        Console.BackgroundColor = lightMode ? ConsoleColor.White : ConsoleColor.Black;
        Console.ForegroundColor = fgColor;
        List<string> lines = File.ReadLines(file.FullName).ToList();
        foreach (string line in lines)
        {
            Console.WriteLine(line);
            await Task.Delay(delay * line.Length);
        };
    }
    

Uygulama şimdi şöyle görünür:

using System.CommandLine;

namespace scl;

class Program
{
    static async Task<int> Main(string[] args)
    {
        var fileOption = new Option<FileInfo?>(
            name: "--file",
            description: "The file to read and display on the console.");

        var delayOption = new Option<int>(
            name: "--delay",
            description: "Delay between lines, specified as milliseconds per character in a line.",
            getDefaultValue: () => 42);

        var fgcolorOption = new Option<ConsoleColor>(
            name: "--fgcolor",
            description: "Foreground color of text displayed on the console.",
            getDefaultValue: () => ConsoleColor.White);

        var lightModeOption = new Option<bool>(
            name: "--light-mode",
            description: "Background color of text displayed on the console: default is black, light mode is white.");

        var rootCommand = new RootCommand("Sample app for System.CommandLine");
        //rootCommand.AddOption(fileOption);

        var readCommand = new Command("read", "Read and display the file.")
            {
                fileOption,
                delayOption,
                fgcolorOption,
                lightModeOption
            };
        rootCommand.AddCommand(readCommand);

        readCommand.SetHandler(async (file, delay, fgcolor, lightMode) =>
            {
                await ReadFile(file!, delay, fgcolor, lightMode);
            },
            fileOption, delayOption, fgcolorOption, lightModeOption);

        return rootCommand.InvokeAsync(args).Result;
    }

    internal static async Task ReadFile(
            FileInfo file, int delay, ConsoleColor fgColor, bool lightMode)
    {
        Console.BackgroundColor = lightMode ? ConsoleColor.White : ConsoleColor.Black;
        Console.ForegroundColor = fgColor;
        List<string> lines = File.ReadLines(file.FullName).ToList();
        foreach (string line in lines)
        {
            Console.WriteLine(line);
            await Task.Delay(delay * line.Length);
        };
    }
}

Yeni alt komutu test edin

Şimdi alt komutu belirtmeden uygulamayı çalıştırmaya çalışırsanız, bir hata iletisi alırsınız ve ardından kullanılabilir alt komutu belirten bir yardım iletisi alırsınız.

scl --file sampleQuotes.txt
'--file' was not matched. Did you mean one of the following?
--help
Required command was not provided.
Unrecognized command or argument '--file'.
Unrecognized command or argument 'sampleQuotes.txt'.

Description:
  Sample app for System.CommandLine

Usage:
  scl [command] [options]

Options:
  --version       Show version information
  -?, -h, --help  Show help and usage information

Commands:
  read  Read and display the file.

Alt komut read için yardım metni dört seçeneğin kullanılabilir olduğunu gösterir. Enum için geçerli değerleri gösterir.

scl read -h
Description:
  Read and display the file.

Usage:
  scl read [options]

Options:
  --file <file>                                               The file to read and display on the console.
  --delay <delay>                                             Delay between lines, specified as milliseconds per
                                                              character in a line. [default: 42]
  --fgcolor                                                   Foreground color of text displayed on the console.
  <Black|Blue|Cyan|DarkBlue|DarkCyan|DarkGray|DarkGreen|Dark  [default: White]
  Magenta|DarkRed|DarkYellow|Gray|Green|Magenta|Red|White|Ye
  llow>
  --light-mode                                                Background color of text displayed on the console:
                                                              default is black, light mode is white.
  -?, -h, --help                                              Show help and usage information

Sadece --file seçeneğini belirterek alt komutu read çalıştırın ve diğer üç seçenek için varsayılan değerleri alırsınız.

scl read --file sampleQuotes.txt

Karakter başına 42 milisaniye varsayılan gecikme, yavaş bir okuma hızına neden olur. --delay daha düşük bir sayıya ayarlayarak hızlandırabilirsiniz.

scl read --file sampleQuotes.txt --delay 0

Metin renklerini ayarlamak için --fgcolor ve --light-mode kullanabilirsiniz:

scl read --file sampleQuotes.txt --fgcolor red --light-mode

--delay için geçersiz bir değer sağladığınızda bir hata iletisi alırsınız:

scl read --file sampleQuotes.txt --delay forty-two
Cannot parse argument 'forty-two' for option '--int' as expected type 'System.Int32'.

--file için geçersiz bir değer sağlarsanız bir özel durum alırsınız:

scl read --file nofile
Unhandled exception: System.IO.FileNotFoundException:
Could not find file 'C:\bin\Debug\net6.0\nofile'.

Alt komutlar ve özel doğrulama ekleme

Bu bölüm, uygulamanın son sürümünü oluşturur. tamamlandığında, uygulama aşağıdaki komutlara ve seçeneklere sahip olur:

  • --file adlı genel* seçeneğiyle root komutu
    • quotes komutu
      • --delay, --fgcolorve --light-mode adlı seçenekleri içeren read komutu
      • quote ve byline adlı bağımsız değişkenlerle add komutu
      • --search-terms adlı seçeneği içeren delete komutu

* Genel bir seçenek, atandığı komut için kullanılabilir ve tüm alt komutlarına özyinelemeli olarak sağlanır.

Kullanılabilir komutların her birini seçenekleri ve bağımsız değişkenleriyle çağıran örnek komut satırı girişi aşağıda verilmiştir:

scl quotes read --file sampleQuotes.txt --delay 40 --fgcolor red --light-mode
scl quotes add "Hello world!" "Nancy Davolio"
scl quotes delete --search-terms David "You can do" Antoine "Perfection is achieved"
  1. Program.csiçinde, --file seçeneğini oluşturan kodu aşağıdaki kodla değiştirin:

    var fileOption = new Option<FileInfo?>(
        name: "--file",
        description: "An option whose argument is parsed as a FileInfo",
        isDefault: true,
        parseArgument: result =>
        {
            if (result.Tokens.Count == 0)
            {
                return new FileInfo("sampleQuotes.txt");
    
            }
            string? filePath = result.Tokens.Single().Value;
            if (!File.Exists(filePath))
            {
                result.ErrorMessage = "File does not exist";
                return null;
            }
            else
            {
                return new FileInfo(filePath);
            }
        });
    

    Bu kod özel ayrıştırma, doğrulama ve hata işleme sağlamak için ParseArgument<T> kullanır.

    Bu kod olmadan, eksik dosyalar özel durum ve yığın izlemesi ile bildirilir. Bu kodla yalnızca belirtilen hata iletisi görüntülenir.

    Bu kod ayrıca varsayılan bir değer belirtir ve bu nedenle isDefaulttrueolarak ayarlar. isDefaulttruedeğerine ayarlamazsanız, --fileiçin hiçbir giriş sağlanmadığında parseArgument temsilcisi çağrılmaz.

  2. lightModeOptionoluşturan koddan sonra add ve delete komutları için seçenekler ve bağımsız değişkenler ekleyin:

    var searchTermsOption = new Option<string[]>(
        name: "--search-terms",
        description: "Strings to search for when deleting entries.")
        { IsRequired = true, AllowMultipleArgumentsPerToken = true };
    
    var quoteArgument = new Argument<string>(
        name: "quote",
        description: "Text of quote.");
    
    var bylineArgument = new Argument<string>(
        name: "byline",
        description: "Byline of quote.");
    

    AllowMultipleArgumentsPerToken ayarı, listede ilk öğeden sonra öğe belirtirken --search-terms seçenek adını atlamanıza olanak tanır. Aşağıdaki komut satırı girişi örneklerini eşdeğer hale getirir:

    scl quotes delete --search-terms David "You can do"
    scl quotes delete --search-terms David --search-terms "You can do"
    
  3. Kök komutu oluşturan kodu ve read komutunu aşağıdaki kodla değiştirin:

    var rootCommand = new RootCommand("Sample app for System.CommandLine");
    rootCommand.AddGlobalOption(fileOption);
    
    var quotesCommand = new Command("quotes", "Work with a file that contains quotes.");
    rootCommand.AddCommand(quotesCommand);
    
    var readCommand = new Command("read", "Read and display the file.")
        {
            delayOption,
            fgcolorOption,
            lightModeOption
        };
    quotesCommand.AddCommand(readCommand);
    
    var deleteCommand = new Command("delete", "Delete lines from the file.");
    deleteCommand.AddOption(searchTermsOption);
    quotesCommand.AddCommand(deleteCommand);
    
    var addCommand = new Command("add", "Add an entry to the file.");
    addCommand.AddArgument(quoteArgument);
    addCommand.AddArgument(bylineArgument);
    addCommand.AddAlias("insert");
    quotesCommand.AddCommand(addCommand);
    

    Bu kod aşağıdaki değişiklikleri yapar:

    • read komutundan --file seçeneğini kaldırır.

    • kök komutuna genel seçenek olarak --file seçeneğini ekler.

    • bir quotes komutu oluşturur ve bunu kök komutuna ekler.

    • read komutunu kök komutu yerine quotes komutuna ekler.

    • add ve delete komutları oluşturur ve bunları quotes komutuna ekler.

    Sonuç aşağıdaki komut hiyerarşisidir:

    • Kök komutu
      • quotes
        • read
        • add
        • delete

    Uygulama artık üst komutun (quotes) bir alanı veya grubu belirttiği ve alt komutlarının (read, add, delete) eylemler olduğu önerilen düzeni uygular.

    Genel seçenekler komuta uygulanır ve alt komutlara tekrar eden bir şekilde uygulanır. --file kök komutunda olduğundan, uygulamanın tüm alt komutlarında otomatik olarak kullanılabilir.

  4. SetHandler kodundan sonra, yeni alt komutlar için yeni SetHandler kodu ekleyin:

    deleteCommand.SetHandler((file, searchTerms) =>
        {
            DeleteFromFile(file!, searchTerms);
        },
        fileOption, searchTermsOption);
    
    addCommand.SetHandler((file, quote, byline) =>
        {
            AddToFile(file!, quote, byline);
        },
        fileOption, quoteArgument, bylineArgument);
    

    Alt komut quotes yaprak komutu olmadığından işleyicisi yoktur. read, addve delete, quotesaltında yaprak alt komutlardır ve her biri için SetHandler çağrılır.

  5. add ve deleteiçin işleyicileri ekleyin.

    internal static void DeleteFromFile(FileInfo file, string[] searchTerms)
    {
        Console.WriteLine("Deleting from file");
        File.WriteAllLines(
            file.FullName, File.ReadLines(file.FullName)
                .Where(line => searchTerms.All(s => !line.Contains(s))).ToList());
    }
    internal static void AddToFile(FileInfo file, string quote, string byline)
    {
        Console.WriteLine("Adding to file");
        using StreamWriter? writer = file.AppendText();
        writer.WriteLine($"{Environment.NewLine}{Environment.NewLine}{quote}");
        writer.WriteLine($"{Environment.NewLine}-{byline}");
        writer.Flush();
    }
    

Tamamlanmış uygulama şöyle görünür:

using System.CommandLine;

namespace scl;

class Program
{
    static async Task<int> Main(string[] args)
    {
        var fileOption = new Option<FileInfo?>(
            name: "--file",
            description: "An option whose argument is parsed as a FileInfo",
            isDefault: true,
            parseArgument: result =>
            {
                if (result.Tokens.Count == 0)
                {
                    return new FileInfo("sampleQuotes.txt");

                }
                string? filePath = result.Tokens.Single().Value;
                if (!File.Exists(filePath))
                {
                    result.ErrorMessage = "File does not exist";
                    return null;
                }
                else
                {
                    return new FileInfo(filePath);
                }
            });

        var delayOption = new Option<int>(
            name: "--delay",
            description: "Delay between lines, specified as milliseconds per character in a line.",
            getDefaultValue: () => 42);

        var fgcolorOption = new Option<ConsoleColor>(
            name: "--fgcolor",
            description: "Foreground color of text displayed on the console.",
            getDefaultValue: () => ConsoleColor.White);

        var lightModeOption = new Option<bool>(
            name: "--light-mode",
            description: "Background color of text displayed on the console: default is black, light mode is white.");

        var searchTermsOption = new Option<string[]>(
            name: "--search-terms",
            description: "Strings to search for when deleting entries.")
            { IsRequired = true, AllowMultipleArgumentsPerToken = true };

        var quoteArgument = new Argument<string>(
            name: "quote",
            description: "Text of quote.");

        var bylineArgument = new Argument<string>(
            name: "byline",
            description: "Byline of quote.");

        var rootCommand = new RootCommand("Sample app for System.CommandLine");
        rootCommand.AddGlobalOption(fileOption);

        var quotesCommand = new Command("quotes", "Work with a file that contains quotes.");
        rootCommand.AddCommand(quotesCommand);

        var readCommand = new Command("read", "Read and display the file.")
            {
                delayOption,
                fgcolorOption,
                lightModeOption
            };
        quotesCommand.AddCommand(readCommand);

        var deleteCommand = new Command("delete", "Delete lines from the file.");
        deleteCommand.AddOption(searchTermsOption);
        quotesCommand.AddCommand(deleteCommand);

        var addCommand = new Command("add", "Add an entry to the file.");
        addCommand.AddArgument(quoteArgument);
        addCommand.AddArgument(bylineArgument);
        addCommand.AddAlias("insert");
        quotesCommand.AddCommand(addCommand);

        readCommand.SetHandler(async (file, delay, fgcolor, lightMode) =>
            {
                await ReadFile(file!, delay, fgcolor, lightMode);
            },
            fileOption, delayOption, fgcolorOption, lightModeOption);

        deleteCommand.SetHandler((file, searchTerms) =>
            {
                DeleteFromFile(file!, searchTerms);
            },
            fileOption, searchTermsOption);

        addCommand.SetHandler((file, quote, byline) =>
            {
                AddToFile(file!, quote, byline);
            },
            fileOption, quoteArgument, bylineArgument);

        return await rootCommand.InvokeAsync(args);
    }

    internal static async Task ReadFile(
                FileInfo file, int delay, ConsoleColor fgColor, bool lightMode)
    {
        Console.BackgroundColor = lightMode ? ConsoleColor.White : ConsoleColor.Black;
        Console.ForegroundColor = fgColor;
        var lines = File.ReadLines(file.FullName).ToList();
        foreach (string line in lines)
        {
            Console.WriteLine(line);
            await Task.Delay(delay * line.Length);
        };

    }
    internal static void DeleteFromFile(FileInfo file, string[] searchTerms)
    {
        Console.WriteLine("Deleting from file");
        File.WriteAllLines(
            file.FullName, File.ReadLines(file.FullName)
                .Where(line => searchTerms.All(s => !line.Contains(s))).ToList());
    }
    internal static void AddToFile(FileInfo file, string quote, string byline)
    {
        Console.WriteLine("Adding to file");
        using StreamWriter? writer = file.AppendText();
        writer.WriteLine($"{Environment.NewLine}{Environment.NewLine}{quote}");
        writer.WriteLine($"{Environment.NewLine}-{byline}");
        writer.Flush();
    }
}

Projeyi derleyin ve aşağıdaki komutları deneyin.

read komutuyla var olmayan bir dosyayı --file gönderin ve özel durum ve yığın izlemesi yerine bir hata iletisi alırsınız:

scl quotes read --file nofile
File does not exist

Alt komut quotes çalıştırmayı deneyin ve sizi read, addveya deletekullanmaya yönlendiren bir ileti alırsınız:

scl quotes
Required command was not provided.

Description:
  Work with a file that contains quotes.

Usage:
  scl quotes [command] [options]

Options:
  --file <file>   An option whose argument is parsed as a FileInfo [default: sampleQuotes.txt]
  -?, -h, --help  Show help and usage information

Commands:
  read                          Read and display the file.
  delete                        Delete lines from the file.
  add, insert <quote> <byline>  Add an entry to the file.

addalt komutunu çalıştırın ve eklenen metni görmek için metin dosyasının sonuna bakın:

scl quotes add "Hello world!" "Nancy Davolio"

Dosyanın başından itibaren arama dizeleriyle alt komut delete çalıştırın ve sonra metnin kaldırıldığı yeri görmek için metin dosyasının başına bakın:

scl quotes delete --search-terms David "You can do" Antoine "Perfection is achieved"

Not

kutusu/debug/net6.0 klasöründe çalışıyorsanız, add ve delete komutlarından kaynaklanan değişiklikleri içeren dosyayı bu klasörde bulabilirsiniz. Proje klasöründeki dosyanın kopyası değişmeden kalır.

Sonraki adımlar

Bu öğreticide, System.CommandLinekullanan basit bir komut satırı uygulaması oluşturdunuz. Kitaplık hakkında daha fazla bilgi edinmek için bkz. System.CommandLine genel bakış.


Ek kaynaklar

Belgeler