如何创建.bat文件来运行c#代码?

时间:2010-08-04 14:05:11

标签: c# batch-file

我需要的是:我有一个c#代码,我想构建它以便在桌面上创建一个.bat文件。因此,当我从桌面运行此.bat文件时,它应该执行c#代码。

有没有办法在编译之前更改c#项目的设置或属性,以便创建一个应运行此c#代码的.bat文件?

8 个答案:

答案 0 :(得分:11)

将C#代码编译到控制台应用程序中。

然后使用批处理文件运行此应用程序。

在桌面上创建一个名为batch.bat(或whatever.bat)的文件,并在其中加入以下内容:

@echo off
[full path to your application]\[application name].exe [any additional parameters]

---替代----

在项目属性中,可以选择构建事件。在post build命令行中输入以下内容:

echo @echo off > [path to desktop batchfile].bat
echo $(TargetPath) >> [path to desktop batchfile].bat

答案 1 :(得分:3)

我理解你的问题,想要使用批处理程序编译C#源文件。假设您的C#源文件如下所示(另存为“test.cs”):

using System;

public class Print
{
    public static void Main()
    {
        Console.WriteLine("Hurray I am printing to the CONSOLE!!");
    }
}

您可以在命令提示符下编译如下:

csc /out:test.exe test.cs

将我们带到批处理文件:

@ECHO OFF
csc /out:test.exe test.cs

或者,通用化,从命令行中取出参数nr 1:

@ECHO OFF
csc /out:%1.exe %1

答案 2 :(得分:2)

作为替代方案,您可能需要考虑使用windows powershell而不是常规的旧命令行。 In the powershell you can work with arbitrary .net assemblies。换句话说,您不必在C#/ VB代码中执行任何操作来容纳命令行。

答案 3 :(得分:1)

  1. 右键单击桌面。
  2. 从菜单中选择新建
  3. 选择文本文档
  4. 键入文本文档的名称,例如“RunCSharp.bat”
  5. 双击新文件
  6. 将以下代码复制到其中。
  7. 从菜单中选择文件保存
  8. 双击该文件。
  9. 批处理文件中的C#代码将编译并运行。
  10. @echo off
    set csfile=%temp%\temp.cs
    echo // C# code > %csfile%
    echo using System; >> %csfile%
    echo using System.Text; >> %csfile%
    echo namespace HelloWorld >> %csfile%
    echo { >> %csfile%
    echo   public class HelloWorldMain >> %csfile%
    echo   { >> %csfile%
    echo     public static void Main() >> %csfile%
    echo     { >> %csfile%
    echo        Console.WriteLine("Hello world!"); >> %csfile%
    echo     } >> %csfile%
    echo   } >> %csfile%
    echo } >> %csfile%
    
    csc /nologo /out:%temp%\temp.exe %csfile%
    %temp%\temp.exe
    pause
    

答案 4 :(得分:1)

  1. 在Visual Studio中,右键单击C#项目并选择“属性”
  2. 转到“构建事件”选项卡
  3. 在帖子构建框中,键入以下内容:
  4. set batchName=%userprofile%\desktop\runCSharp.bat
    echo @echo off > %batchName%
    echo "$(TargetPath)" >> %batchName%
    echo pause >> %batchName%
    

    这将在桌面上创建一个批处理文件,用于运行已编译的c#程序。

答案 5 :(得分:1)

您可以在dostips上查看self-compiled .net hybrids主题。 根据我的最好的技术是使用msbuild和内联任务的技术 - 它不会创建.exe文件并且没有冗余输出:

<!-- :
    @echo off


        echo -^- FROM BATCH

        set "CMD_ARGS=%*"
        ::::::  Starting C# code :::::::
        :: searching for msbuild location
        for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do  set "msb=%%#"

        if not defined  msb (
           echo no .net framework installed
           exit /b 10
        )

        rem ::::::::::  calling msbuid :::::::::
        call %msb% /nologo  /noconsolelogger "%~dpsfnx0"  /property:"H=From C#"
        rem ::::::::::::::::::::::::::::::::::::
        exit /b %errorlevel%
--> 


<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="_">
    <_/>
  </Target>
  <UsingTask
    TaskName="_"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" > 

    <ParameterGroup  >
         <Z ParameterType="System.String">$(H)</Z>
    </ParameterGroup>

    <Task>
      <Using Namespace="System" />
      <Code Type="Fragment" Language="cs">
        <![CDATA[
            String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
            System.Console.WriteLine("-- "+"$(H)");  
        ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

唯一的一点是,对于命令行参数,您必须在批处理部分中创建一个变量(例如set "CMD_ARGS=*%"),然后从C#代码中提取环境变量。

另一个注意事项是您不能在批处理部分中直接使用--字符串,因为不会解析xml。

请注意第一行:是重要的,因为它使用批处理文件的解析优先级 - 它将被解释为:<!--,在执行期间将采用标签而不执行。

如果你想使用整个类,请遵循这个例子(你需要扩展ITask和Task和Execute方法):

<!-- :
    @echo off


        echo -^- FROM BATCH

        set "CMD_ARGS=%*"
        ::::::  Starting C# code :::::::
        :: searching for msbuild location
        for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do  set "msb=%%#"

        if not defined  msb (
           echo no .net framework installed
           exit /b 10
        )

        rem ::::::::::  calling msbuid :::::::::
        call %msb% /nologo  /noconsolelogger "%~dpsfnx0"
        rem ::::::::::::::::::::::::::::::::::::
        exit /b %errorlevel%

--> 


<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Program">
    <Program/>
  </Target>
  <UsingTask
    TaskName="Program"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" > 

    <Task>
      <Reference Include="$(MSBuildToolsPath)\System.Windows.Forms.dll"/>
      <Using Namespace="System" />

      <Code Type="Class" Language="cs">
        <![CDATA[
    using Microsoft.Build.Framework;
    using Microsoft.Build.Utilities;
    using System;

    public class Program:Task, ITask
    {
        public override bool Execute(){
            Console.WriteLine("Whoa");
            String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
            System.Console.WriteLine("-- "+"$(MSBuildToolsVersion)"); 
            return true;
        }
    }
        ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

如果您只需要几种方法(这么简单的片段不会起作用),而不是整个课程,您可以查看:

<!-- :
    @echo off


        echo -^- FROM BATCH

        set "CMD_ARGS=%*"
        ::::::  Starting C# code :::::::
        :: searching for msbuild location
        for /r "%SystemRoot%\Microsoft.NET\Framework\" %%# in ("*msbuild.exe") do  set "msb=%%#"

        if not defined  msb (
           echo no .net framework installed
           exit /b 10
        )

        rem ::::::::::  calling msbuid :::::::::
        call %msb% /nologo  /noconsolelogger "%~dpsfnx0"
        rem ::::::::::::::::::::::::::::::::::::
        exit /b %errorlevel%

--> 


<Project ToolsVersion="$(MSBuildToolsVersion)" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="_">
    <_/>
  </Target>
  <UsingTask
    TaskName="_"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v$(MSBuildToolsVersion).dll" > 

    <Task>
      <Reference Include="$(MSBuildToolsPath)\System.Windows.Forms.dll"/>
      <Using Namespace="System" />

      <Code Type="Method" Language="cs">
        <![CDATA[

        public override bool Execute(){
            MyMethod();
            return true;
        }

        void MyMethod(){
            Console.WriteLine("Whoa");
            String CMD_ARGS=Environment.GetEnvironmentVariable("CMD_ARGS");
            System.Console.WriteLine("-- "+"$(MSBuildToolsVersion)"); 
        }
        ]]>
      </Code>
    </Task>
  </UsingTask>
</Project>

答案 6 :(得分:0)

您只需在桌面上创建执行以下操作的批处理文件

cd \<applicationdirectory>\bin\<release or debug depending on your build configuration>
START <application name>

您需要做的就是在桌面上创建一个.txt文件,将上面的命令放在文件中(使用正确的目录和名称),然后将文件重命名为.bat

答案 7 :(得分:0)

我知道这已经太晚了,但将来有些人可能会受益。

在vs中我们可以使用控制台应用程序编写批处理

开放vs - &gt;档案 - &gt;新 - &gt;项目 - &gt;控制台应用程序。

您可以在google中查询如何编写控制台应用程序。