许多命令行实用程序使用参数,例如:
gacutil /i MyDLL.dll
或
regasm /tlb:MyDll.tlb MyDll.dll
如何设置.NET控制台应用程序以接收命令行参数,其次,如何在上面的相应示例中模拟处理“{option}”参数,如/i
和/tlb:
?
答案 0 :(得分:7)
您为Main方法声明了一个参数:
public static void Main(string[] args)
现在你有一个数组,第一个例子包含:
args[0] = "/i"
args[1] = "MyDLL.dll"
您只需要解析字符串以确定参数的含义。有点像:
foreach (string cmd in args) {
if (cmd.StartsWith("/")) {
switch (cmd.Substring(1)) {
case "i":
// handle /i parameter
break;
// some more options...
default:
// unknown parameter
break;
}
} else {
// cmd is the filename
}
}
答案 1 :(得分:5)
答案 2 :(得分:1)
您只需使用Main
方法获取string[]
参数:
class Test
{
static void Main(string[] args)
{
foreach (string arg in args)
{
Console.WriteLine(arg);
}
}
}
由您来适当地解析参数,因为框架中没有任何内容可以做到这一点。您可能希望查看NDesk.Options库。 (还有很多其他的,但这似乎很受欢迎。我不能说我自己也用过它,请注意。)
答案 3 :(得分:1)
您需要自己处理(或使用现有库)来处理命令行参数。请参阅MSDN(Main()和命令行参数)。
一个好的库是Mono.Options,另一个我使用的是commandline。
在您的控制台应用程序中,您将拥有一个main方法,该方法采用string[]
参数(默认情况下为约定),此参数名为args
。此数组包含所有命令行参数。然后你可以解析它们。
答案 4 :(得分:0)
This page有一个VB.NET示例
Sub Main()
Dim arrArgs() A s String = Command.Split(“,”)
Dim i As Integer
Console.Write(vbNewLine & vbNewLine)
If arrArgs(0) <> Nothing Then
For i = LBound(arrArgs) To UBound(arrArgs)
Console.Write(“Parameter “ & i & ” is “ & arrArgs(i) & vbNewLine)
Next
Else
Console.Write(“No parameter passed”)
End If
Console.Write(vbNewLine & vbNewLine)
End Sub
This MSDN page有一个C#示例:
static int Main(string[] args)
{
// Test if input arguments were supplied:
if (args.Length == 0)
{
System.Console.WriteLine("Please enter a numeric argument.");
System.Console.WriteLine("Usage: Factorial <num>");
return 1;
}
// Try to convert the input arguments to numbers. This will throw
// an exception if the argument is not a number.
// num = int.Parse(args[0]);
int num;
bool test = int.TryParse(args[0], out num);
if (test == false)
{
System.Console.WriteLine("Please enter a numeric argument.");
System.Console.WriteLine("Usage: Factorial <num>");
return 1;
}
.....
答案 5 :(得分:0)
应用程序的入口点可以声明为:
static void Main (string[] args) { ... }
这为您提供了一个字符串数组,其中每个元素都是命令行参数之一。一旦你得到它,只需解析数组中的字符串来配置你的应用程序中的选项。
答案 6 :(得分:0)
我倾向于为此编写自己的逻辑,因为我通常不想为我的控制台应用程序创建额外的外部依赖项。
下面是我编写的一些代码,用于使用命令行参数填充一些变量。此代码旨在支持使用“/”或“ - ”为参数名称添加前缀,并且如果参数采用值(即它不是标志),则支持将值与名称分隔为“:”或“”。
请原谅缺乏评论;)
static void Main(string[] args)
{
string directory = null;
string filePattern = null;
string sourceDirectory = null;
string targetDirectory = null;
List<string> version = null;
string action = null;
bool showHelp = false;
for (int i = 0; i < args.Length; i++)
{
string parameterName;
int colonIndex = args[i].IndexOf(':');
if (colonIndex >= 0)
parameterName = args[i].Substring(0, colonIndex);
else
parameterName = args[i];
switch (parameterName.ToLower())
{
case "-dir":
case "/dir":
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
directory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
}
else
{
i++;
if (i < args.Length)
{
directory = args[i];
}
else
{
System.Console.WriteLine("Expected a directory to be specified with the dir parameter.");
}
}
break;
case "-sourcedir":
case "/sourcedir":
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
sourceDirectory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
}
else
{
i++;
if (i < args.Length)
{
sourceDirectory = args[i];
}
else
{
System.Console.WriteLine("Expected a directory to be specified with the sourcedir parameter.");
}
}
break;
case "-targetdir":
case "/targetdir":
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
targetDirectory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
}
else
{
i++;
if (i < args.Length)
{
targetDirectory = args[i];
}
else
{
System.Console.WriteLine("Expected a directory to be specified with the targetdir parameter.");
}
}
break;
case "-file":
case "/file":
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
filePattern = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
}
else
{
i++;
if (i < args.Length)
{
filePattern = args[i];
}
else
{
System.Console.WriteLine("Expected a file pattern to be specified with the file parameter.");
return;
}
}
break;
case "-action":
case "/action":
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
action = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
}
else
{
i++;
if (i < args.Length)
{
action = args[i];
}
else
{
System.Console.WriteLine("Expected an action to be specified with the action parameter.");
return;
}
}
break;
case "-version":
case "/version":
if (version == null)
version = new List<string>();
if (colonIndex >= 0)
{
int valueStartIndex = colonIndex + 1;
version.Add(args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex));
}
else
{
i++;
if (i < args.Length)
{
version.Add(args[i]);
}
else
{
System.Console.WriteLine("Expected a version to be specified with the version parameter.");
return;
}
}
break;
case "-?":
case "/?":
case "-help":
case "/help":
showHelp = true;
break;
default:
System.Console.WriteLine("Unrecognized parameter \"{0}\".", parameterName);
return;
}
}
// At this point, all of the command line arguments have been read
// and used to populate the variables that I defined at the top.
// The rest of my application will work with the variables
// and will not reference to args array again.
}