C#スクリプトのすゝめ(.csx)

コンピュータ

C#スクリプトはコンパイラ型の言語であるC#をスクリプト言語の様に扱うことが出来ます。

通常のC#プログラミングでは、新しくプロジェクトを作成して、複数の設定やファイルを準備する必要があります。
しかし、C#スクリプト(.csx)であれば、プロジェクトの作成は不要。
テキストエディタで.csx形式のソースコード(スクリプトファイル)を書き、ビルドやコンパイル作業も一切なしで、そのまま即実行することができます。

導入

次のコマンドを Windows ターミナル(PowerShell / cmd / Windows Terminal) で実行してください。

dotnet tool install -g dotnet-script

バージョンの確認

dotnet script --version
# 1.6.0

スクリプトの実行方法

拡張子

拡張子は.csxになります。

サンプルスクリプト

ファイル名:hello.csx”

#r "System.dll"

Console.WriteLine("Hello C# Script");

#r "System.dll"は本来不要ですが、vscodeでConsole.WriteLine()が見つからないとエラーが出ていましたので回避用のおまじないです。

実行

dotnet-script hello.csx

# 結果
# Hello C# Script

ファイル操作を操作するスクリプト

カレントディレクトリのファイル・サブディレクトリの一覧を出力

UNIXのlsコマンドやMS-DOSのdirコマンドの様にコンソールにファイルの一覧を出力します。

// カレントディレクトリのファイル・サブディレクトリの一覧

using System;
using System.IO;

// カレントディレクトリを取得
string dir = Directory.GetCurrentDirectory();

foreach (var entry in Directory.EnumerateFileSystemEntries(dir))
{
    // エントリ=ファイル・サブディレクトリをコンソールへ出力
    Console.WriteLine(entry);
}

テキストファイルを1行ごと読み込み出力する

C#スクリプトでUNIXの「cat」相当(最小サンプル)

// テキストファイルを1行ごと読み込み出力する。
using System;
using System.IO;

string path = "sample.txt"; // ここに読み込みたいファイル名を指定

foreach (string line in File.ReadLines(path))
{
    Console.WriteLine(line);
}

ファイルのコピー

// ファイルのコピー
using System;
using System.IO;

string src = "dir.csx"; // コピー元ファイル
string dst = "dir_copy.txt"; // コピー先ファイル

File.Copy(src, dst, overwrite: true);
Console.WriteLine($"{src} を {dst} にコピーしました。");

ファイルの移動・リネーム

// ファイルの移動・リネーム
using System;
using System.IO;

string src = "dir_copy.txt";    // 移動元ファイル
string dst = "dir_rename.txt";  // 移動先ファイル

File.Move(src, dst, overwrite: true);
Console.WriteLine($"{src} を {dst} に移動(リネーム)しました。");

ファイルの削除

// ファイルの削除

using System;
using System.IO;

string path = "dir_rename.txt"; // 削除するファイル

if (File.Exists(path))
{
    File.Delete(path);
    Console.WriteLine($"{path} を削除しました。");
}
else
{
    Console.WriteLine($"{path} は存在しません。");
}

ファイルの新規作成

// ファイルの新規作成
using System;
using System.IO;

string path = "sample.txt"; // 新規作成するファイルのパス

// 空ファイル作成(既存ならタイムスタンプのみ更新)
using (var fs = File.Open(path, FileMode.OpenOrCreate))
{
    fs.Close();
}
File.SetLastWriteTime(path, DateTime.Now);

Console.WriteLine($"{path} を touch しました。");

ディレクトリの作成

// ディレクトリの作成
using System;
using System.IO;

var path = @".\SubFolder";

if (!Directory.Exists(path))
{
    Directory.CreateDirectory(path);
    Console.WriteLine($"ディレクトリを作成しました: {path}");
}
else
{
    Console.WriteLine($"既に存在します: {path}");
}

ディレクトリの削除

// ディレクトリの削除
using System;
using System.IO;

var path = @".\SubFolder"; // 必要に応じて変更してください

if (Directory.Exists(path))
{
    Directory.Delete(path, recursive: true);
    Console.WriteLine($"ディレクトリを削除しました: {path}");
}
else
{
    Console.WriteLine($"指定されたディレクトリは存在しません: {path}");
}

コメント