Visual Studio基于生成后输出使生成失败

z2acfund  于 2023-08-07  发布在  其他
关注(0)|答案(1)|浏览(143)

当使用Visual Studio构建时,我们通过构建后事件步骤复制一堆dll。
当前的构建步骤如下所示:

xcopy <source/file> <target/file>
if errorlevel 1 goto VCEnd
xcopy <...> <...>
if errorlevel 1 goto VCEnd
...

字符串
这样做的问题是,如果xcopy没有找到一个文件,因为它有一个错误的名称或它不存在,构建仍然会通过。原因是虽然xcopy打印File not found - <some_file>,但它并没有设置errorlevel
我的任务是确保构建实际上未能使开发人员更快地意识到这个问题。
我的想法是创建一个新的子例程,检查构建日志是否包含“File not found”,并在每一步之后调用这个子例程:

xcopy <source/file1> <target/file1>
call :check_xcopy_success
xcopy <source/file2> <target/file2>
call :check_xcopy_success
...

goto :end

:check_xcopy_success
type $(Configuration)\$(AssemblyName).log | findstr /i /c:"File not found" > nul
if %errorlevel%==0 ( echo "Postbuild: error 1234: Unable to copy lib" && goto VCEnd )
exit /b

:end


SO
然而,这并没有做任何事情。一开始我以为这个文件不能被打开阅读,因为VS仍然在写它,但是我可以通过for循环获取文件内容:

:check_xcopy_success
setlocal enabledelayedexpansion
set content=
for /f "delims=" %%i in ('type $(Configuration)\$(AssemblyName).log') do set content=!content! %%i
echo !content!
endlocal
exit /b


SO
这将在一行中显示文件的内容,这对于我使用findstr来说是很好的,但以这种方式使用它也没有做任何事情:

(echo !content! | findstr /i /c:"File not found" > nul)
echo %errorlevel%


将输出0,无论搜索字符串或文件的内容如何,因此有条件地输出一个错误信号VS,该错误信号VS表示构建失败,这种方式也不起作用。
我哪里做错了?你有什么其他的想法我可以做什么?

nbysray5

nbysray51#

我找到了一个比我最初的方法更简单的解决问题的方法。我不是先收集所有文件内容并检查一次,而是在迭代时检查每一行:

:check_xcopy_success
for /f "delims=" %%i in ('type $(Configuration)\$(AssemblyName).log') do (
  ( echo %%i | findstr /i /c:"File not found" > nul ) && ( echo Postbuild: error 1234: Unable to copy lib, see output for more specific information && goto :end )
)
exit /b

字符串
我不完全确定为什么这是有效的,我最初的方法没有,但也许它在未来帮助了某人。

相关问题