从.BAT运行带有.application文件类型的c#控制台应用程序

时间:2011-06-08 06:10:37

标签: c# console batch-file console-application command-line-arguments

我已经创建了一个可以读取命令参数的控制台应用程序(使用Visual Studio 2010)。

当我调试时,我解析了一些在Project->中设置的测试参数。 [项目名称]属性... - >调试 - >命令行参数:

它的内容如下: “parametername1 | parametervalue1”“parametername2 | parametervalue2”“parametername3 | parametervalue3”

我使用以下代码来读取参数:

for (Int16 argumentsCount = 0; argumentsCount < args.Length; argumentsCount++)
{
    String[] parameterItem = args[argumentsCount].Split('|');
    String parameterName = parameterItem[0].ToString();
    String parameterValue = parameterItem[1].ToString();
    /*code continues*/

}

当我在调试模式下运行时,它可以正常工作,所有参数都被读取。

然后我将应用程序发布到服务器并确保它安装时具有正确的权限(出于演示的目的,可以说它位于C:\ MyApp上,而Complied代码驻留在MyApp.application中

然后我创建了一个执行应用程序的批处理脚本。 * .BAT包含以下命令:

"C:\MyApp\MyApp.application" "parametername1|parametervalue1" "parametername2|parametervalue2" "parametername3|parametervalue3"

当我运行批处理时,这种工作就像应用程序一样...但是......我的应用程序没有收到任何参数。我知道这是因为我重新编译并发布了一些代码来读取接收的参数数量:

Console.Write("Arguments " + args.Length.ToString());

,显示参数:0

有人可以告诉我如何编写我的批处理脚本来运行应用程序并解析我的参数/命令行参数。

2 个答案:

答案 0 :(得分:2)

ETA:没关系。您的问题是.application而不是.exe。查看文件关联.application.exe相比会发生什么:

> assoc .application
.application=Application.Manifest

> ftype Application.Manifest
Application.Manifest=rundll32.exe dfshim.dll,ShOpenVerbApplication %1

> assoc .exe
.exe=exefile

> ftype exefile
exefile="%1" %*

你看到传递的内容有何不同?即正常的可执行文件获得命令行参数(%*)。所以我猜你应该使用一个可执行文件而不是一个可执行的清单或者.application实际上是什么(我从来没有在野外看到它,老实说)。


使用相当少的测试程序

class Args {
    static void Main(string[] args) {
        for (int i = 0; i < args.Length; i++) {
            System.Console.WriteLine("[{0}]=<{1}>", i, args[i]);
        }
    }
}

它对我来说很好。以下批处理文件:

@"args.exe" "parametername1|parametervalue1" "parametername2|parametervalue2" "parametername3|parametervalue3"

产生以下输出:

[0]=<parametername1|parametervalue1>
[1]=<parametername2|parametervalue2>
[2]=<parametername3|parametervalue3>

所以我猜你没有告诉我们的代码有什么问题。也许您实际上没有在C#应用程序中使用命令行参数,而是在那里引用不同的string[]

答案 1 :(得分:-1)

管道字符|在批处理文件中具有特殊含义。我建议使用不同的角色来简化事情。否则,您必须使用Escape Character来使用管道符。它可能看起来像这样:

"C:\MyApp\MyApp.application" "parametername1^|parametervalue1" "parametername2^|parametervalue2" "parametername3^|parametervalue3"

请注意管道^之前的插入符号|