

# 要旨

## 現在やっていること

WindowsのPowerShellで、ユーザーのクライアントソリューションを開発しています．特に問題なく動いているのですが、やはりユーザー側からクラウドベースに載せたい旨のリクエストがありました．クラウドのプラットフォームはLinuxになる見込みです．

## 教えていただきたいこと

現在のシェルスクリプトでは

  * Javaを起動しJavaベースのXSLTプロセッサを動かす．
  * Windowsアプリケーションの.exeを動かす

を順に組み合わせていくつかのステップで行っています．  
ここで、

  * 起動している側のプログラムの標準出力、エラー出力をリアルタイムで取得したい
  * エラーだったらそこで終了させるため、各ステップの戻り値を得たい

の必要があるため、次のようなC#のコードをAdd-
Typeして各ステップのプログラム起動の際に使用しています．Windowsだと.NETが標準でついてくるので（Visual
Studioなしでも）C#のコンパイルと実行が可能です．

これをLinuxで行いたいのですが ①そもそもLinuxのPowerShellからでC#をコンパイル/実行可能であるか？
②実行するにはどのような準備・設定が必要であるか？を教えていただきたいです．

LinuxにおけるPowerShellとか、.NETのLinuxでのディストリビューションとか話だけは伺っていますが、何分にもすぐ試せる環境がありません．

# 該当する.ps1の記述

## メインの.ps1

[code]

    Import-Module "$($PSScriptRoot)/module" -Variable 'procTools'
    Add-Type -TypeDefinition $procTools -Language CSharp
    
[/code]

## module/module.psm1

[code]

    # C# codes for executing process
    # Standard output & error output from process are captured by the handler and asynchronously outputted by Console.WriteLine.
    $procTools = @"
    
    using System;
    using System.Diagnostics;
    
    namespace Proc.Tools
    {
      public static class exec
      {
        public static int runCommand(string executable, string args = "", string cwd = "", string verb = "runas") {
    
          //* Create your Process
          Process process = new Process();
          process.StartInfo.FileName = executable;
          process.StartInfo.UseShellExecute = false;
          process.StartInfo.CreateNoWindow = true;
          process.StartInfo.RedirectStandardOutput = true;
          process.StartInfo.RedirectStandardError = true;
    
          //* Optional process configuration
          if (!String.IsNullOrEmpty(args)) { process.StartInfo.Arguments = args; }
          if (!String.IsNullOrEmpty(cwd)) { process.StartInfo.WorkingDirectory = cwd; }
          if (!String.IsNullOrEmpty(verb)) { process.StartInfo.Verb = verb; }
    
          //* Set your output and error (asynchronous) handlers
          process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler);
          process.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler);
    
          //* Start process and handlers
          process.Start();
          process.BeginOutputReadLine();
          process.BeginErrorReadLine();
          process.WaitForExit();
    
          //* Return the commands exit code
          return process.ExitCode;
        }
        public static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) {
          //* Do your stuff with the output (write to console/log/StringBuilder)
          Console.WriteLine(outLine.Data);
        }
      }
    }
    "@
    
[/code]

## Add-Typeしたクラスのメソッドの実行（例）

[code]

    $ret = [Proc.Tools.exec]::runCommand($java_exec, $java_cmd_param);
    Write-Host 'XSLT processing return code:' $ret  -ForegroundColor Magenta -BackgroundColor Black
    if ($ret -ne 0) {exit}
    
[/code]

# その他要件

## PowerShellのバージョン

[code]

    PS D:\My_Documents> $PSVersionTable.PSVersion
    
    Major  Minor  Patch  PreReleaseLabel BuildLabel
    -----  -----  -----  --------------- ----------
     7      2      6
    
[/code]

## Windowsアプリケーションの.exe

このアプリケーションにはLinux版があるので、クラウドに移行した場合はそちらを使用します．

以上 よろしくお願いいたします．

# 追記

## 想定される Linuxのディストリビューションとバージョン

現時点ではまだクライアントソリューションの開発中です．お客さまからは特にLinuxのディストリビューション、バージョンなどは示されず、「クラウドのLinux稼働環境で」動かせるか？と打診されている状態です．残念ながらまだ大まかな話です．


CC BY-SA 4.0
2022-09-13T03:20:05.010
91072
2022-09-13T07:27:22.070
2022-09-13T07:27:22.070
9503
9503
question
c# linux powershell
PowerShellでAdd-TypeでC#のコードを指定しています．Linuxで動かすには？