Ö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.
Proje için scl adlı bir klasör oluşturun ve ardından yeni klasörde bir komut istemi açın.
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.
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.
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.
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.
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.");
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);
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);
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.
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
, --fgcolor
ve --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"
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 isDefault
true
olarak ayarlar.
isDefault
'ı true
değerine ayarlamazsanız, --file
için hiçbir giriş sağlanmadığında parseArgument
temsilcisi çağrılmaz.
lightModeOption
oluş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"
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:
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.
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
, add
ve delete
, quotes
altında yaprak alt komutlardır ve her biri için SetHandler
çağrılır.
add
ve delete
iç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
, add
veya delete
kullanmaya 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.
add
alt 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.CommandLine
kullanan basit bir komut satırı uygulaması oluşturdunuz. Kitaplık hakkında daha fazla bilgi edinmek için bkz. System.CommandLine genel bakış.