Сценарии 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%
будет отображать код завершения этой программы (т. е. ноль в случае успешной компиляции, ненулевое значение в противном случае), а не сценарий, который она запускает.
Несколько вариантов, которые приходят на ум:
использование
csc.exe
вместо этого, чтобы сгенерировать исполняемое приложение из вашего скрипта. Запустите это и запишите его код выхода.Если по какой-то причине все это должно произойти за один раз, создайте небольшое приложение, которое принимает путь сценария в качестве входного аргумента, порождает
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()));