Batch file 从批处理脚本启动exe并在缺少dll时获取错误代码

Batch file 从批处理脚本启动exe并在缺少dll时获取错误代码,batch-file,dll,Batch File,Dll,我需要自动测试一个可执行文件在启动时是否没有丢失的dll。这个检查是通过Jenkins(持续集成)完成的,它可以执行批处理脚本 尽管我进行了所有的测试,但如果缺少一个或多个dll,我找不到使用批处理脚本启动可执行文件并获取错误代码的方法 “CALL myexecutable.exe”可以正常工作,当dll丢失(-1073741515)时,它返回一个不同于0的代码,但显然,我需要手动停止程序 我通过混合几个批处理脚本(一个执行调用,另一个在几秒钟的睡眠后终止可执行文件的进程,等等…)尝试了很多使用

我需要自动测试一个可执行文件在启动时是否没有丢失的dll。这个检查是通过Jenkins(持续集成)完成的,它可以执行批处理脚本

尽管我进行了所有的测试,但如果缺少一个或多个dll,我找不到使用批处理脚本启动可执行文件并获取错误代码的方法

“CALL myexecutable.exe”可以正常工作,当dll丢失(-1073741515)时,它返回一个不同于0的代码,但显然,我需要手动停止程序

我通过混合几个批处理脚本(一个执行调用,另一个在几秒钟的睡眠后终止可执行文件的进程,等等…)尝试了很多使用命令“START”的方法,但是我发现,当缺少dll时,唯一一种使代码与0不同的方法是使用“CALL myexecutable.exe”

编辑:实际上,为了简化,我搜索了一种方法来检测从批处理文件启动的exe在启动时失败(但目前,我没有找到一种方法来自动关闭程序,因为当dll丢失时,会出现一个带有错误消息的对话框)。我不想知道涉及哪个dll。在我的例子中,我可以假设如果程序在启动时失败,原因是缺少dll


有人有办法帮我吗?

依赖性Walker允许以间接方式捕获未解析的DLL

depends.exe /c /ot:a-ldd.txt a.exe
findstr "Error: " a-ldd.txt > nul && echo unresolved
Windows操作系统在弹出警报之前会检查注册表设置。我想这可以阻止整个机器的弹出窗口

reg query HKLM\SYSTEM\CurrentControlSet\Control\Windows
reg add HKLM\SYSTEM\CurrentControlSet\Control\Windows /v ErrorMode /t REG_DWORD /f /d 2

我还没有找到一种方法来禁用每个进程的弹出窗口。表示调用SetErrorMode只影响当前进程(调用SetErrorMode(0x8003)后从PowerShell脚本启动可执行文件时,我试图抑制丢失的DLL警报失败)。

依赖项遍历器允许以间接方式捕获未解析的DLL

depends.exe /c /ot:a-ldd.txt a.exe
findstr "Error: " a-ldd.txt > nul && echo unresolved
Windows操作系统在弹出警报之前会检查注册表设置。我想这可以阻止整个机器的弹出窗口

reg query HKLM\SYSTEM\CurrentControlSet\Control\Windows
reg add HKLM\SYSTEM\CurrentControlSet\Control\Windows /v ErrorMode /t REG_DWORD /f /d 2

我还没有找到一种方法来禁用每个进程的弹出窗口。a表示
SetErrorMode
调用仅影响当前进程(在调用SetErrorMode(0x8003)后从PowerShell脚本启动可执行文件时,我试图抑制丢失的DLL警报失败)。

IMO这是不可能的。即使程序中引用的.dll不在路径中,您如何从外部知道当前情况下是否需要它们?一种非常简单的方法是使用sysinternals中的strings.exe来搜索程序代码中的.dll文件,并检查它们是否在路径中,路径为/f“delims=“%A in('strings-n7 YourProgram.exe^ findstr/i“\.dll“)do@where/Q“%A”|@Echo%A未找到实际上,所需的所有dll都位于与exe相同的目录中。如果安装程序(.msi),我想与Jenkins自动检查即使有人添加了一个需要新dll的新函数,但他忘了将其添加到安装程序中,程序也会部署所需的所有dll。但如果这不可能,我会忘记这个想法。我不知道是否需要从程序外部部署dll,但当您执行缺少dll的exe时,会出现一条错误消息,并显示程序我认为有一种方法可以用错误代码检测程序的失败(批处理命令调用就是这种情况,但程序需要手动停止).IMO这是不可能的。即使程序中引用的.dll不存在于路径中,您如何从外部知道在当前情况下是否需要它们?一种非常简单的方法是使用sysinternals中的strings.exe来搜索程序代码中的.dll文件,并检查它们是否位于路径中,
for/f“delims=”%A in('strings-n7 YourProgram.exe^ findstr/i“\.dll“')do@where/Q“%A”|@Echo%A未找到
实际上,所需的所有dll都位于与exe相同的目录中。如果安装程序(.msi),我想与Jenkins自动检查即使有人添加了一个需要新dll的新函数,但他忘了将其添加到安装程序中,程序也会部署所需的所有dll。但如果这不可能,我会忘记这个想法。我不知道是否需要从程序外部部署dll,但当您执行缺少dll的exe时,会出现一条错误消息,并显示程序我认为有一种方法可以用错误代码检测程序的失败(批处理命令调用就是这种情况,但程序需要手动停止)。