公司使用的是windows10+QT5.12.8作为开发环境,今天发现单独执行qmake编译单个项目没有任何问题,但是切换到批处理来依次编译多个项目时,会出现命令太长的问题,网上找了半天目前有以下几种方案来解决此问题。
报错截图:
复现操作:
@echo off
set PATH=%PATH%;%PATH%;%PATH%;%PATH%;%PATH%;%PATH%;%PATH%
echo %PATH%
错误原因:
1、命令行中,一行代码究竟可以写多长?
(win10环境)经过测试,一行代码最多可以输入8192个字符。(8K大)
set至少后面有【一个空格】【变量名最短是1】【等号】三个字符,其后最多只剩8089
测试代码
@echo off & setlocal enabledelayedexpansion
for /l %%i in (1,1,10000) do (
if not defined x set a=!a!1||set x=!n!
set /a n+=1
)
echo;变量最长!x!
for /l %%i in (1,1,10) do (
set e=!e!1
if not defined y echo;!a!!e!>nul||set y=!x!
set /a x+=1
)
echo;参数最长!y!
pause & exit /b
解决办法1:
使用setlocal命令包含vcvarall.bat
官方解释【SETLOCAL命令开始时,任何由外部脚本或命令行设置的变量或环境变量都不会影响当前批处理脚本中的代码执行,SETLOCAL命令会持续到出现匹配的ENDLOCAL命令或者到达批处理文件结尾为止】可以理解为SETLOCAL做了一个隔离,vcvarall.bat每次执行设置的变量不会影响到下一次执行
代码示例:
REM setlocal
call %VCDIR%\vcvarall.bat x86_amd64
REM endlocal
REM setlocal
call %VCDIR%\vcvarall.bat x86_amd64
REM endlocal
解决办法2:
vcvarsall.bat的源码提到了vcvarsall.bat执行成功后会设置一个环境变量VisualStudioVersion来保存当前MSVC编译器的版本号。所以只要判断这个变量是否定义就可以确定是否已经正确设置MSVC环境变量:
代码示例:
@echo
set VCDIR="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build"
if not defined VisualStudioVersion (
call %VCDIR%"\vcvarsall.bat" x86_amd64
)
参考链接:【WINDOWS / DOS 批处理】setlocal命令、endlocal命令详解_扬科网络的博客-CSDN博客
msvc:BAT脚本判断是否设置MSVC编译的环境变量(执行vcvarsall.bat)_msvc 生成后事件 调用bat-CSDN博客