2015-11-08 2 views
2

Я пытаюсь скомпилировать некоторые острые файлы на ходу, используя командный файл в окнах.Как определить, успешно ли скомпилирован csc.exe

Вот .bat файл

C:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /t:exe /out:the.exe %1 
the.exe 

Мои файлы имеют Console.Read() вызов, чтобы остановить окно от закрытия и для пользователя, чтобы увидеть выход исполнения. Проблема заключается в том, что если компиляция не работает по какой-либо причине, окно показывает проблему компиляции и немедленно закрывается, так как она никогда не достигает вызова Read().

Я могу использовать pause в конце в файле .bat, но затем мне нужно нажать клавишу дважды, чтобы закрыть окно, если компиляция/выполнение завершается успешно.

Что я хотел бы знать, если компиляция прошла успешно или нет. Если он был успешным, выполните the.exe или, если он не был тогда, не выполнил исполняемый файл, а вместо pause или что-то еще, чтобы остановить окно, чтобы я мог видеть ошибки.

+0

ли инструмент компилятора 'csc.exe' возвращает код ошибки? Если это так, вы можете добавить '&& the.exe || pause'; '&&' и '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ; чтобы выяснить, возвращается ли код ошибки, поместите 'echo% ErrorLevel%' после командной строки 'csc' и запустите скрипт (непосредственно из командной строки) с и без возникновения ошибки компиляции; перезагрузите командную строку каждый раз, чтобы убедиться, что состояние ошибки сбрасывается ... – aschipfl

+0

Да, я тоже думал об этом, но возвращаемый вывод - это строка, начинающаяся с материалов лицензирования Microsoft и т. д., а затем куча отказа от ответственности и т. д. И тогда любые ошибки там могут быть. Одним из решений является анализ результатов и поиск ключевых слов, таких как «предупреждение» или «ошибка», но это похоже на взломание и использование меча для вязания свитера. Должно быть более элегантное решение. – Achshar

+0

Ах, стреляй в ErrorLevel, это то, что мне нужно. Благодаря тонну! Если вы можете отправить ответ, я соглашусь с ним. – Achshar

ответ

3

Предположив инструмент компилятора csc.exe возвращает код ошибки (ErrorLevel), вы могли бы добавить && the.exe || pause так:

"C:\windows\Microsoft.NET\Framework\v4.0.30319\csc.exe" /t:exe /out:the.exe "%~1" && the.exe || pause 

&& и || условные команды сепараторов. Первая из них выполняет следующую команду в случае отсутствия ошибки, то есть код возврата 0 (без ошибок); второй - в случае ошибки (код возврата 0).

Обратите внимание, что этот подход может отличить успех компиляции или отказ. Могут возникать предупреждения, которые могут не отображаться в возвращаемом коде ошибки.


Чтобы выяснить, является ли код ошибки возвращается, который можно получить с помощью встроенной переменной ErrorLevel, положить echo %ErrorLevel% & pause после командной строки csc.exe и запустить скрипт, один раз и один раз, не вызывая ошибку компиляции. Для этого вам необходимо убедиться, что состояние ошибки сбрасывается - либо путем перезапуска командной строки каждый раз, либо путем сброса в 0 явно, выполнив cmd /C exit 0 перед каждой попыткой.

Смежные вопросы