Сценарии CSharp, возможно ли вернуть значение из сценария, запущенного с помощью csi.exe?

Я хотел бы создать такой скрипт:

static int Main(string[] args)  
{
    if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
    {
        return -1;
    }
    return 6;
}

И запустите его так и получите уровень ошибки:

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\15.0\Bin\Roslyn\csi.exe" E:\build\CruiseControl\bin\TestLoggingConfigExists.csx

ECHO% ERRORLEVEL%

1 ответ

Решение

Программа, которую вы запускаете, будет csi.exe так что %ERRORLEVEL% будет отображать код завершения этой программы (т. е. ноль в случае успешной компиляции, ненулевое значение в противном случае), а не сценарий, который она запускает.

Несколько вариантов, которые приходят на ум:

  1. использование csc.exe вместо этого, чтобы сгенерировать исполняемое приложение из вашего скрипта. Запустите это и запишите его код выхода.

  2. Если по какой-то причине все это должно произойти за один раз, создайте небольшое приложение, которое принимает путь сценария в качестве входного аргумента, порождает csc.exe чтобы создать исполняемый файл, запустить его и маршалировать его код выхода. (или используйте компиляцию в памяти + альтернатива выполнения: https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-compilation-using-roslyn)

Редактировать 2: на этот раз намного проще

Передача кода завершения в Environment.Exit в конце сценария делает эту работу.

static int Main(string[] args)
{
    if ( !File.Exists( @"E:\Ivara\Cache\TimeCacheLastUpdated.txt" ) )
    {
        return -1;
    }
    return 6;
}

// csi.exe normally ignores the exit code from Main, but we can terminate
// the csi.exe process abruptly, and forward the exit code to the caller.
Environment.Exit(Main(Args.ToArray()));
Другие вопросы по тегам