C#のconsoleプロジェクトで標準入力と標準出力

コンピュータ

標準出力は意識しなくともコンソールに文字を表示する為にConsole.WriteLine()使っていました。
では標準入力はC#でどのようにして使うのでしょうか?
以下はのサンプルプログラムは標準入力で入力された文字列をそのまま標準出力へ出力するプログラムになります。

class Program
{
    static void Main()
    {
        string? line = Console.ReadLine();
        while(line != null)
        {
            Console.WriteLine(line);
            line = Console.ReadLine();
        }
    }
}

こちらをビルドして単体で実行してみます。

PS F:\csharp\dotnet8\console\StdPassThrough> StdPassThrough.exe
abc
abc
^Z
PS F:\csharp\dotnet8\console\StdPassThrough>

実行すると標準入力の入力待ちになりますのでabcと入力しエンターキーを押します。
そうしますと、標準出力にabcが出力されます。
また入力待ちになり繰り返しますので、終了する場合「Ctr」+「Z」を押すと終了します。

次にPowerShell(pwsh.exe)で文字列をパイプで送り込んでみます。

PS F:\csharp\dotnet8\console\StdPassThrough> echo "Hoge" | StdPassThrough.exe
Hoge

パイプで送り込んだ”Hoge”が出力されました。

同じくPowerShellでファイルの一覧をパイプで送り込んでみます。

PS F:\csharp\dotnet8\console\StdPassThrough> ls | % { $_.FullName } | StdPassThrough
F:\csharp\dotnet8\console\StdPassThrough\.vscode
F:\csharp\dotnet8\console\StdPassThrough\bin
F:\csharp\dotnet8\console\StdPassThrough\obj
F:\csharp\dotnet8\console\StdPassThrough\Program.cs
F:\csharp\dotnet8\console\StdPassThrough\StdPassThrough.csproj

% { $_.FullName }でファイルのフルパスだけを渡しています。

ちなみに%{ $_.Name }にするとファイル名(親ディレクトリのパスを含まない)になります。またStdPassThroughへパイプへつながなくとも結果が同じなので動作を確認する為にさらにパイプでつないで文字を加工してみます。

PS F:\csharp\dotnet8\console\StdPassThrough> ls | % { $_.Name } | StdPassThrough | % { "[" + $_ + "]" }
[.vscode]
[bin]
[obj]
[Program.cs]
[StdPassThrough.csproj]

使い道として画像ファイルを加工するフィルタープログラムなど、加工元の画像ファイルのパスを標準入力で受け取り、画像加工を実行、結果をファイルに保存し保存したファイルのパスを標準出力に出力するような使い方が出来そうです。

PowerShellのパイプラインでは文字列だけでなくオブジェクトを受け渡すことが出来るので、もっと違うやり方もありそうですが、昔ながらのシンプルな文字列をやり取りするほうが取り回しが良いツールになりそうです。

コメント