批处理文件:"此时 2>&1 出乎意料。



我对此做了大量的搜索,但我找到的答案没有一个有效或最终是相关的。我希望有人能帮助我,我希望这可能是一个足够普遍的问题,以帮助别人。

我已经采取了批处理文件(工作),并一直在重新工作,使其更好地格式化,更结构化,等....函数":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 ON

if %rebase% == 1 (

这样你就可以看到发生了什么

同样,如果您要附加STDOUT的输出,您可能也想附加STDERR的输出。如上面2>>&1…虽然这不是你的问题

最新更新