我对此做了大量的搜索,但我找到的答案没有一个有效或最终是相关的。我希望有人能帮助我,我希望这可能是一个足够普遍的问题,以帮助别人。
我已经采取了批处理文件(工作),并一直在重新工作,使其更好地格式化,更结构化,等....函数":build"中有一行使用命令管道中常见的2>&1方法将STDERR重定向到STDOUT。
rem EnableDelayedExpansion
@echo off
setlocal
rem ##########################################################
rem NOTE: User should have enviornment variable already set
rem up for ToolsBasePath to point to the views directory for
rem US Tools.
rem ##########################################################
rem ##########################################################
rem Global Setup
rem ##########################################################
echo Global Setup: Setup enviornment variables used for build script
title Creating Time Stamp
call :getTS REM timestamp is now in variable %TIMESTAMP%
rem This file creates logs either at NBLDir (e.g. c:_NightlyBuildLogs)
title Initializing script variables
set ViewDirC=C:views
set NBLDir=C:_NightlyBuildLogs
set path=%ToolsBasePath%stpbin;C:WindowsMicrosoft.NETFrameworkv4.0.30319;%path%
set nightlyLog=%NBLDir%%TIMESTAMP%_nightly.log
REM Initialize all build/update variables to 0
set update=0
set rebase=0
set rebaseComplete=0
set sync=0
set sconsClean=0
set sconsBuild=0
set cab=0
rem Create header for Nightly Build Log
echo ######################################################### >>%nightlyLog%
echo Nightly Build Log >> %nightlyLog%
time /T >> %nightlyLog%
echo ######################################################### >>%nightlyLog%
echo: >> %nightlyLog%
echo PATH=%PATH% >> %nightlyLog%
echo ViewDirC=%ViewDirC% >> %nightlyLog%
echo ToolsBasePath=%ToolsBasePath% >> %nightlyLog%
echo NBLDir=%NBLDir% >> %nightlyLog%
echo: >> %nightlyLog%
rem Update US Tools
title Updating US Tools (~10 minutes)
echo Update US Tools (~10 minutes)
time /t
echo Update US Tools >> %nightlyLog%
time /T >> %nightlyLog%
echo ######################################################### >>%nightlyLog%
rem Comment this out for now just to skip it to test the build portion
rem call cchar_EWS_updateUSTools.cmd %TIMESTAMP%
echo Update of US Tools Complete >> %nightlyLog%
time /T >> %nightlyLog%
time /t
echo:
title Building V2016 (~60 minutes)
echo Build V2016 (~60 minutes)
echo Build V2016 (~60 minutes) >> %nightlyLog%
time /T
time /T >> %nightlyLog%
echo ######################################################### >> %nightlyLog%
call :BuildV2016
echo Build of V2016 Complete >> %nightlyLog%
time /T >> %nightlyLog%
time /T
echo:
rem END of Main()
goto :end
:BuildV2016
cd /d %ViewDirC%cchar_V2016DEV_EWS
rem Base ClearCase Settings
set update=0
rem UCM ClearCase Settings
set rebase=0
set rebaseComplete=0
rem Note: sync is like update, only really beneficial if others are
rem delivering to your stream or you are working on more than one view.
set sync=0
rem SCons Builds Settings
set sconsClean=0
set sconsBuild=1
set cab=1
echo Starting Build of V2016 >> %nightlyLog%
call :build
exit /b
rem ##########################################################
rem Build section, recommend you make no modifications below here.
rem ##########################################################
goto :end
:build
echo ######################################################### >> %nightlyLog%
echo Building/Updating from %cd%
echo Building/Updating from %cd% >> %nightlyLog%
time /T >> %nightlyLog%
time /T
echo rebase=%rebase% >> %nightlyLog%
echo sync=%sync% >> %nightlyLog%
echo update=%update% >> %nightlyLog%
echo sconsClean=%sconsClean% >> %nightlyLog%
echo sconsBuild=%sconsBuild% >> %nightlyLog%
echo cab=%cab% >> %nightlyLog%
set vgr=1
set qlab=0
if %vgr% == 1 set buildDir=vgrDevEnvbuild
if %qlab% == 1 set buildDir=QlabCorebuild
if %rebaseComplete% == 1 (
set rebase=1
set rebaseOptions=-complete
) else ( set rebaseOptions= )
rem Perform Rebase
set rebaseLog=%NBLDir%%TIMESTAMP%_rebase.log
if %rebase% == 1 (
echo rebaseLog=%rebaseLog% >> %nightlyLog%
set update=0
set sync=0
echo Rebasing %rebaseLog% >> %nightlyLog%
cleartool rebase -rec %rebaseOptions% -force -abort >> %rebaseLog% 2>&1
)
if %sync% == 1 (
echo Syncing... >> %nightlyLog%
cleartool setcs -stream
)
if %update% == 1 (
echo Updating %cd%... >> %nightlyLog%
cleartool setcs -current
)
rem Build SCONS
if %sconsClean% == 1 sconsCount.exe -clean >> %nightlyLog% 2>&1
if %sconsBuild% == 1 (
set buildLog=%NBLDir%%TIMESTAMP%_build.log
echo buildLog=%buildLog% >> %nightlyLog%
echo Building SCons %buildLog% >> %nightlyLog%
call %buildDir%scons.bat -k > %buildLog% 2>&1
sconsCount.exe >> %buildLog% 2>&1
wxsMissingFileTest >> %buildLog%
SConsBuildReport %buildLog% >> %nightlyLog%
)
REM Build Cabs
if %cab% == 1 (
set cabLog=%NBLDir%%NBLDir%%TIMESTAMP%_cab.log
echo cabLog=%cabLog% >> %nightlyLog%
echo Creating CAB files >> %nightlyLog%
call %buildDir%cabs.bat >> %cabLog%
)
rem exit from :Build
exit /b
:getTS
REM Slice the %date% string to get date parts
set tsyear=%date:~-4%
set tsmonth=%date:~4,2%
set tsday=%date:~7,2%
REM Put date parts together, subtituting "" for the " " because for
REM some reason the shell adds a space to each variable.
set TSDATE=%tsyear: =%%tsmonth: =%%tsday: =%
REM Slice the %time% string to get time parts
set tshour=%time:~0,2%
set tsminute=%time:~3,2%
set tsseconds=%time:~6,2%
set tsmilliseconds=%time:~-2%
REM Put time parts together, subtituting "" for the " " because for
REM some reason the shell adds a space to each variable.
set TSTIME=%tshour: =%%tsminute: =%%tsseconds: =%%tsmilliseconds: =%
set TIMESTAMP=%TSDATE%%TSTIME%
exit /b
:end
echo ######################################################### >> %nightlyLog%
echo Build(s) completed >> %nightlyLog%
time /T >> %nightlyLog%
endlocal
所讨论的行是:cleartool rebase - rebaseOptions% -force -abort>> %rebaseLog% 2>&1
这是在"if %rebase%"块中,讽刺的是,它甚至没有被调用。我猜它只是在解析过程中失败了。
有人知道为什么这会给我"2>&1 was unexpected at this ."错误吗?
我敢肯定你已经误诊了错误在哪里。
我认为错误在以下代码块中:
if %sconsBuild% == 1 (
set buildLog=%NBLDir%%TIMESTAMP%_build.log
echo buildLog=%buildLog% >> %nightlyLog%
echo Building SCons %buildLog% >> %nightlyLog%
call %buildDir%scons.bat -k > %buildLog% 2>&1
sconsCount.exe >> %buildLog% 2>&1
wxsMissingFileTest >> %buildLog%
SConsBuildReport %buildLog% >> %nightlyLog%
)
注意,您在块中定义了buildLog
,然后尝试在同一块中使用它。当然,扩展将为空,因为在解析块时该值不存在。这两行
call %buildDir%scons.bat -k > %buildLog% 2>&1
sconsCount.exe >> %buildLog% 2>&1
成为 call vgrDevEnvbuildscons.bat -k > 2>&1
sconsCount.exe >> 2>&1
你有你的错误。
只需在块前定义值。
set buildLog=%NBLDir%%TIMESTAMP%_build.log
if %sconsBuild% == 1 (
echo buildLog=%buildLog% >> %nightlyLog%
echo Building SCons %buildLog% >> %nightlyLog%
call %buildDir%scons.bat -k > %buildLog% 2>&1
sconsCount.exe >> %buildLog% 2>&1
wxsMissingFileTest >> %buildLog%
SConsBuildReport %buildLog% >> %nightlyLog%
)
其他问题:- 你在你的日期字符串中得到额外的空格,因为你的分配有一个不需要的尾随空格。使用SET时最好使用引号,因为最后一个引号之后的所有内容都将被忽略,并且您不必担心隐藏的尾随空格
set "tsyear=%date:~-4%" Everything after the last quote is ignored
即使你修复了尾随空格的问题,你仍然可以在小时值中得到一个前导空格,因为
%TIME%
在时间在10am之前会留下空格而不是0
。您应该意识到:getTS例程高度依赖于您的语言环境。例如,它不能在我的机器上工作—它在值中引入了
/
。一个简单的搜索产生了使用WMIC获取当前时间戳的更好的方法,这种方法与地区无关。
我认为问题是:
163 call %buildDir%scons.bat -k > %buildLog% 2>&1
注释掉或删除@echo off
,我的机器上的输出以:
C:Userspwatsont>rem Build SCONS
C:Userspwatsont>if 0 == 1 sconsCount.exe -clean 1>>C:_NightlyBuildLogs -26-1-213054826_nightly.log 2>&1
2>&1 was unexpected at this time.
C:Userspwatsont> call vgrDevEnvbuildscons.bat -k > 2>&1
这会使stdout看起来没有目标文件名。这是因为没有使用延迟扩展。在if
块中,将%buildLog%
替换为!buildLog!
。
下一个块也是一样。使用!cabLog!
代替%cabLog%
在大多数情况下引用%buildLog%, %nightlyLog%, %rebaseLog%是一个很好的做法(除非您要回叫这些变量的内容),因为它们可能包含空格或特殊字符。
cleartool rebase -rec %rebaseOptions% -force -abort >> "%rebaseLog%" 2>>&1
如果不能解决这个问题,那么暂时在
行上方添加@ECHO ONif %rebase% == 1 (
这样你就可以看到发生了什么
同样,如果您要附加STDOUT的输出,您可能也想附加STDERR的输出。如上面2>>&1…虽然这不是你的问题