#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()
И это, похоже, выполняет свою работу: