当使用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表示构建失败,这种方式也不起作用。
我哪里做错了?你有什么其他的想法我可以做什么?
1条答案
按热度按时间nbysray51#
我找到了一个比我最初的方法更简单的解决问题的方法。我不是先收集所有文件内容并检查一次,而是在迭代时检查每一行:
字符串
我不完全确定为什么这是有效的,我最初的方法没有,但也许它在未来帮助了某人。