Стандартная строка вывода из консольного приложения C #

#powershell #console-application #system.diagnostics

#powershell #консольное приложение #system.diagnostics

Вопрос:

У меня есть консольное приложение .Net Framework, написанное на C #, которое запускается из сценария Powershell. Я хочу иметь возможность получать значение из консольного приложения в результате запуска консольного приложения.

В качестве грубого примера у меня есть это…

 namespace PlainConsoleApp
{
    class Program
    {
        static int Main(string[] args)
        {
            int result = 0;

            switch (args[0])
            {
                case "one":
                    result = 1;
                    break;
                case "two":
                    result = 2;
                    break;
                default:
                    result = -1;
                    break;
            }

            return resu<
        }
    }
}
 

И это выполняется с помощью следующего сценария Powershell (я очень новичок в Powershell):

 $consoleApp = "C:TempPlainConsoleApp.exe"
$arg1 = "one"

$submitprocess = start-process $consoleApp $arg1 -Wait -PassThru -NoNewWindow

$result = $submitprocess.ExitCode
Write-Host "exit code: "   $result

exit $submitprocess.ExitCode
 

Итак, когда я запускаю это, я вижу, что получаю возвращаемый результат в ExitCode … Однако мне посоветовали посмотреть $p.StandardOutput.ReadToEnd() . Если я затем попытаюсь запустить что-то вроде этого:

 $consoleApp = "C:TempPlainConsoleApp.exe"
$arg1 = "one"

$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $consoleApp
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $arg1
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
Write-Host "stdout: $stdout"
Write-Host "stderr: $stderr"
Write-Host "exit code: "   $p.ExitCode
 

Кажется, я все еще получаю возвращаемое значение из ExitCode . Кроме того, я хотел бы иметь возможность возвращать либо bool, либо строку, но, похоже, из консольного приложения возвращаются только целые числа??

Любая помощь или совет по этому поводу были бы весьма признательны!

Ответ №1:

Я изменил консольное приложение на что-то вроде этого:

     static void Main(string[] args)
    {
        string resu<

        switch (args[0])
        {
            case "1":
                result = "one";
                break;
            case "2":
                result = "two";
                break;
            case "3":
                result = "three";
                break;
            case "4":
                result = "four";
                break;
            case "5":
                result = "five";
                break;
            default:
                result = "null";
                break;
        }

        Console.Out.Write(result);
    }
 

А теперь вызовите приложение следующим образом:

 $console = "C:DevLocal ProjectsPlainConsoleAppPlainConsoleAppbinDebugPlainConsoleApp.exe"
$arg1 = "5"


$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $console
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $arg1
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
Write-Host "stdout:" $p.StandardOutput.ReadToEnd()
 

И это, похоже, выполняет свою работу:

введите описание изображения здесь