如何创建命令行应用程序

时间:2015-07-13 10:26:47

标签: c# visual-studio

使用VisualStudio可以很容易地为Console,Forms等创建应用程序类型,但我看不到命令​​行应用程序的选项。我打算在c:\ windows \ system32中将下面的小程序安装为一个简单的.exe。如果我打开一个命令终端和CD到VS项目的bin \ debug目录,我可以输入DateTime并获得不错的输出。但是,如果我将DateTime.exe复制到c:\ windows \ system32并打开另一个命令终端,则命令DateTime会出现错误,指出由于.Net Shim错误导致应用程序无法启动。

我应该做些不同的事情来创建命令行应用程序而不是控制台应用程序吗?

我应该从c:\ windows \ system32中的bin \ debug目录安装更多文件吗?

using System;

namespace DateTime
{
    class Program
    {
        static void Main()
        {
                Console.Write(System.DateTime.Now.ToString("o"));
        }
    }
}

注意:上述命令行应用程序的原因是系统命令Date/TTime/T不提供秒输出。我的应用显示例如2015-07-13T10:58:29.7329261 + 02:00(,您可以使用参数获取其他格式,请参阅此问题的先前编辑)

3 个答案:

答案 0 :(得分:3)

控制台项目是一个命令行项目。

您可以使用args []跟踪命令行参数。

您的可执行文件可能具有依赖项:您可以使用混淆器或其他工具将它们打包到.exe中,这样您就不需要外部文件了。

或者,将项目安装到自己的文件夹中,然后修改PATH variable以包含目录的路径 - 这将允许您从任何文件夹运行.exe,就像您可以运行'dir'一样任何文件夹。

我不清楚您的DateTime问题是什么,但您可以使用.ToString()重载来调整格式,.Parse()可以使用各种格式来解释日期。

var dt = new DateTime();
dt.ToString("dd/MM/yyyy hh:mm:ss");

答案 1 :(得分:0)

正如SLC所建议的,我试图用C ++编写这个应用程序。事实证明,VisualStudio提供了C ++ Console应用程序的选择:使用CLR或Win32,其中CLR代表dot-Net Framework。实际上,Win32项目构建为一个简单的.EXE文件,可以安装在%PATH%中提到的任何目录中,例如C:\ Windows \ System32 \。

VisualStudio不为C#控制台应用程序提供此选择。

不幸的是,C ++是C#倒退的一步:它更复杂。对于某些类型的应用程序,它应该运行得更快,但开发时间更长。将此C ++代码与上面的C#源代码进行比较:

#include "stdafx.h"
#include <iostream>
#include <ctime>

int main()
{
    // get current time
    time_t time_now = time(0);
    // convert to local time struct
    struct tm tstruct;
    localtime_s(&tstruct, &time_now);
    // format to string
    char str_time[80];
    strftime(str_time, sizeof(str_time), "%Y-%m-%d %H:%M:%S", &tstruct);
    // to stdout
    std::cout << str_time << std::endl;
    return 0;
}

如上所述,上述C ++代码(作为Win32 Console project)将作为%PATH%目录中的单个.EXE文件运行。

为了完整性,这里有一个更好的C ++源代码,作为CLR Console project,即.Net Framework,它将像C#一样快速编码,但也不会作为单个.EXE文件运行来自%PATH%的目录。

#include "stdafx.h"
using namespace System;
int main()
{
    Console::WriteLine(DateTime::Now);
    Console::WriteLine(DateTime::Now.ToString(L"o"));
    Console::WriteLine(DateTime::Now.ToString(L"yyyy-MM-dd HH:mm:ss"));
    return 0;
 }

输出是,例如:

14-7-2015 16:23:27
2015-07-14T16:23:27.6978497+02:00
2015-07-14 16:23:27

上述应用程序也是从PowerShell进行测试的,但基于CLR / .Net的应用程序也无法从%PATH%运行。

答案 2 :(得分:0)

有一个简单的 NuGet 包,可帮助您创建自己的命令行应用程序,而无需处理行解析参数和映射类型等许多事情,

https://www.nuget.org/packages/CommandLineTool/