Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如果nmake在批处理过程中失败,则返回错误和电子邮件_Batch File_Cmake_Nmake - Fatal编程技术网

Batch file 如果nmake在批处理过程中失败,则返回错误和电子邮件

Batch file 如果nmake在批处理过程中失败,则返回错误和电子邮件,batch-file,cmake,nmake,Batch File,Cmake,Nmake,我正在尝试创建批处理,以实现Windows下的夜间构建。我设法在发行版中编译,并通过脚本自动调试生成 但是现在我想知道编译过程中是否有错误,如果失败需要返回电子邮件。这就提出了以下问题: 我会返回一个错误吗?或者更确切地说,如果批处理失败,则批处理本身 如果是这样,我怎样才能在文本文件或电子邮件中返回此错误 我正在运行的是一台Windows Server 2012,并使用任务调度器实现自动化。这是我的一批(已编辑): @echo on echo[ set rel=release @echo ##

我正在尝试创建批处理,以实现Windows下的夜间构建。我设法在发行版中编译,并通过脚本自动调试生成

但是现在我想知道编译过程中是否有错误,如果失败需要返回电子邮件。这就提出了以下问题:

我会返回一个错误吗?或者更确切地说,如果批处理失败,则批处理本身

如果是这样,我怎样才能在文本文件或电子邮件中返回此错误

我正在运行的是一台Windows Server 2012,并使用任务调度器实现自动化。这是我的一批(已编辑)

@echo on
echo[
set rel=release
@echo ####### COMPILATION CORE (DEBUG / x86) #######
echo[
cd C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo ####### delete cache  #######
rm -R *
@echo ####### Generation of Makefile  #######
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
cmake -DCMAKE_BUILD_TYPE=Debug -G"NMake Makefiles" ../
if %errorlevel% neq 0 goto mailcmaked 

@echo ####### compilation of core  #######
echo[
nmake
if %errorlevel% neq 0 goto mailnmaked
pause

@echo ####### COMPILATION CORE(RELEASE / x86) #######
echo[
cd C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo ####### Suppression du CACHE  #######
rm -R *
@echo ####### Generation of Makefile  #######
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
cmake -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" ../
if %ERRORLEVEL% neq 0 goto mailcmaker

@echo ####### Compilation of CORE  #######
echo[
>"..\log\buildRel.log" nmake
if %errorlevel% neq 0 goto mailnmaker
pause

:mailcmaked
echo Error!
sendEmail -f from@mail.com -t someone@mail.com -m "cmake debug failed" -s 192.168.x.x
exit 1

:mailnmaked
echo Error!
sendEmail -f from@mail.com -t someone@mail.com -m "nmake debug failed" -s 192.168.x.x
exit 1

:mailcmaker
sendEmail -f from@mail.com -t someone@mail.com -m "cmake release failed" -s 192.168.x.x
exit 1

:mailnmaker
grep -Eo '.{0,20}error.{0,100}' ..\log\buildRel.log > ..\log\mailBuild.txt
sendEmail -f from@mail.com -u "build failed" -t someone@mail.com -m "nmake release failed" -a ..\log\mailBuild.txt -s 192.168.x.x
exit 1
编辑

我从你的例子中汲取灵感编辑了我的脚本,现在效果很好(目前只针对
:mailnmaker
部分)。我用grep命令组织输出

对于邮件问题,我刚刚安装了sendEmail,并将其放在我的Windows路径中,这一切正常


感谢您的帮助。

首先,没有本机命令可用于发送电子邮件。您可以使用Windows脚本(VBScript或JScript)编写脚本。将Windows脚本主机合并到批处理脚本中最简单的方法是

如果
cmake
nmake
以非零状态退出,则可以使用启动发送电子邮件功能

下面是一个示例框架,让您开始学习请注意,这是未经测试的,可能会被破坏。但无论如何,它至少应该给您一个开始的位置

(还请注意,我用本机Windows命令替换了
rm-R*
,并且
cmake
nmake
的输出被重定向到
%temp%\build.log
,以便在需要时包含在电子邮件中。如果您还希望将输出回显到控制台,如果您有cygwin,则可能必须使用
tee-a
)或安装gnuwin32或类似产品;或可能合并。)

@如果(@code节==@Batch)@那么
@呼应
回音[
@echo编译核心(调试/x86)#######
调用:使调试| |退出/b%ERRORLEVEL%
@echo编译核心(RELEASE/x86)#######
呼叫:释放| |退出/b%ERRORLEVEL%
后藤:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:制造
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
回音[
cd/d C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo删除缓存#######
对于(*)中的/d%%I,执行rmdir/q/s“%%~I”
德尔/q/y*
@echo制作文件#######
调用“C:\ProgramFiles(x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat”
::如果cmake退出非零,则使用条件执行发送电子邮件
>“%temp%\build.log”cmake-DCMAKE_build_TYPE=%1-G“NMake makefile”。/|(
呼叫:sendmail cmake%1%ERRORLEVEL%
退出/b%ERRORLEVEL%
)
@echo编译内核(调试/x86)#######
回音[
::如果nmake退出非零,则使用条件执行发送电子邮件
>“%temp%\build.log”nmake | |(
呼叫:sendmail nmake%1%ERRORLEVEL%
退出/b%ERRORLEVEL%
)
后藤:EOF
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:sendmail
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
cscript/nologo/e:JScript“%~f0”“%~1”“%~2”“%~3”“%temp%\build.log”
出口/b%~3
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
::结束批处理/开始JScript
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
@结束
var buildstep=WSH.Arguments(0),
buildtype=WSH.Arguments(1),
errorlevel=WSH.Arguments(2),
buildlog=WSH.Arguments(3),
oSH=WSH.CreateObject('WScript.Shell'),
fso=WSH.CreateObject('Scripting.FileSystemObject');
函数sendmail(配置){
试一试{
var oMsg=WSH.CreateObject(“CDO.Message”);
对于(配置中的变量i)oMsg[i]=配置[i];
oMsg.Send();
}
捕获(e){
var profile=oSH.Environment('Process')('USERPROFILE'),
alert=fso.CreateTextFile(profile+'\\Desktop\\builderr.log',1);
alert.WriteLine(buildstep+'build type'+buildtype
+“失败。电子邮件失败。一切都坏了。我放弃了。”);
alert.WriteLine(getLog(20));
alert.Close();
}
}
函数getLog(行){
log=fso.OpenTextFile(buildlog,1),
内容=[];
而(!log.AtEndOfStream){
contents.push(log.ReadLine());
如果(contents.length>lines)contents.shift();
}
log.Close();
返回内容。join('\n');
}
发送电子邮件({
来自:from@example.com",
至:to@example.com",
主题:“构建失败”,
TextBody:buildstep+“构建类型”+构建类型
+“失败,错误代码为”+错误级别
+'\n\n来自'+buildlog+'的最后20行消息:\n\n'+getLog(20)
});

Ouah。谢谢。这对我来说有点复杂^^^但我明天会试试。