C#とバッチファイル

.NET Frameworkをインストールすると、C:\Windows\Microsoft.NET\Framework\v4.0.30319\ あたりに csc.exe があるんですな。これで .cs をコンパイルして .exe 生成できる。
HelloWorld.cs を作って、

public class HelloWorld
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Hello world.");
    }
}

csc.exe でビルド。

csc helloworld.cs

これで helloworld.exe が生成される。


ビルドが成功したら自動的に実行したいのでバッチファイルにしてみる。ついでに、.cs ファイルが更新されたときだけビルドするようにしたい。

@ECHO OFF
SET CSC="%windir%\Microsoft.NET\Framework\v4.0.30319\csc.exe"
SET ALLPARAMS=%*
CALL :EXEC %1 "%~dpn1.exe"
GOTO :EOF

:EXEC
IF "%~t1" GEQ "%~t2" %CSC% %ALLPARAMS%
IF %ERRORLEVEL% == 0 "%~dpn1"

これで、

cscx helloworld.cs

とすると、必要なときだけビルドして、エラーが無ければ実行される感じに。
そうそう、バッチファイルで使う「%~dpn1」みたいな文字列で使われる d とか p とか n の意味を調べるときは「CALL /?」が便利ということに気付いた。今まで何度もググって調べてたけど、こんな簡単に調べられるものだったとは...。
バッチファイルの下から2行目で、パラメータで渡された1つめのファイルの日付と .exe の日付を文字列で比較してるんだけど、日付は「短い形式」の文字列になるので、「分」が変わらない限り無駄にビルドされるのが残念。
とりあえずこれで、PHPPerlWSH を使うのと同じくらい気軽に C# が使えるかな。使わないかもしれないけど。


それから...

using System;

class ConsoleTest
{
	public static void Main(string[] args)
	{
		Console.ForegroundColor = ConsoleColor.Yellow;
		Console.Write("きいろ!!");
		Console.ForegroundColor = ConsoleColor.Cyan;
		Console.Write("みずいろ!!");
		Console.ResetColor();
	}
}

これ実行すると

色つき。cmdはcommand.comと違ってエスケープシーケンスを処理してくれないから、色つきの文字って出ないのかと思ってた...。COLORコマンドあるけど、全体の色が変わってしまうし。