2014-08-27 79 views
0

我遇到了在使用签出文件重建解决方案时未记录日志的问题。我显然不明白发生了什么问题。所以我决定问社区。使用MSBuild记录不适用于BATCH中签出的文件

我有两种不同的解决方案,但我想使用目前无法使用的检出文件解决方案。

  1. 该解决方案应该获取BuildDrop的最新文件。
  2. 查看解决方案中的核心目录。
  3. 将BuildDrop文件复制到核心目录。
  4. 用新核心构建解决方案。
  5. (重建时登录到日志文件)
  6. 签入新核心。

解决方案,而结账(作品):

@echo off 
REM Pfad in denen die Build Drops liegen 
set MAINPATH=\\devteamx\BuildDrops\MAIN 

REM Pfad in denen die Custom Solutions (Parent) liegen 
set CUSTOMPATH=C:\Sources\RECY6\CUSTOM 

REM Ausgabe Pfad für Custom dll's 
set OUTDIR=C:\Sources\CustomRelease 

rd %OUTDIR% /s /q 
set ERRORLEVEL= 
set neueste= 
FOR /F %%i IN ('dir %MAINPATH% /b /ad-h /o-d') DO (
    SET neueste=%%i 
    GOTO :end 
) 
:end 
set MAINPATH=%MAINPATH%\%neueste%\x86\Release 
echo Latest Builddrop of Main is in %MAINPATH% 
xcopy /s /e /v /y /r /k %MAINPATH% %OUTDIR%\ 

set COREPATH= 
setlocal EnableDelayedExpansion 
for /f "tokens=1* delims=" %%s in ('dir %CUSTOMPATH% /b /ad') do (
    call :Task %%s 
) 

echo Rebuild of Custom Solutions succeed pause exit 

:Showerror 
echo Build error occurred in %1 
pause 
exit 

:Task %1 
set COREPATH=%CUSTOMPATH%\%1\RECY\Core 
set SLNPATH=%CUSTOMPATH%\%1\RECY 
set ISCUSTOMBUILD=True 
echo Corepath of %1 is %COREPATH% 
echo %SLNPATH% 
xcopy /s /e /v /y /r /k %MAINPATH% %COREPATH% 
set msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319 
call %msBuildDir%\msbuild.exe /t:Rebuild %SLNPATH%\RECY.sln /p:Configuration=Release /p:OutDir=%OUTDIR% /l:FileLogger,Microsoft.Build.Engine;logfile="CustomDllRelease_%1_%date%.log" 
if ERRORLEVEL 1 goto :Showerror %1 
set msBuildDir= 
echo CustomSolution: %1 

解决方案与结帐(不工作):

@echo off 
REM Pfad in denen die Build Drops liegen 
set MAINPATH=\\devteamx\BuildDrops\MAIN 

REM Pfad in denen die Custom Solutions (Parent) liegen 
set CUSTOMPATH=C:\Sources\RECY6\CUSTOM 

REM Ausgabe Pfad für Custom dll's 
set OUTDIR=C:\Sources\CustomRelease 

REM Visual Studio Version mit tf 
set TFPFAD=C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE 

REM Tf Command get Method um die letzten Aenderungen abzurufen 
pushd "%CUSTOMPATH%" 
"%TFPFAD%\tf.exe" get "$/RECY6/CUSTOM" /recursive 

rd %OUTDIR% /s /q 
set ERRORLEVEL= 
set neueste= 
FOR /F %%i IN ('dir %MAINPATH% /b /ad-h /o-d') DO (
    SET neueste=%%i 
    GOTO :end 
) 
:end 
set MAINPATH=%MAINPATH%\%neueste%\x86\Release 
echo Latest Builddrop of Main is in %MAINPATH% 

set COREPATH= 
setlocal EnableDelayedExpansion 
for /f "tokens=1* delims=" %%s in ('dir %CUSTOMPATH% /b /ad') do (
    call :Task %%s 
) 

xcopy /s /e /v /y /r /k %MAINPATH% %OUTDIR%\ 
REM pushd "%CUSTOMPATH%" 
REM "%TFPFAD%\tf.exe" undo "$/RECY6/CUSTOM" /recursive /noprompt 
echo Rebuild of Custom Solutions succeed 
pause 
exit 

:Showerror 
pushd "%CUSTOMPATH%\%1" 
"%TFPFAD%\tf.exe" undo "$/RECY6/CUSTOM" /recursive /noprompt 
echo Build error occurred in %1 
pause 
exit 

:Task %1 
REM Tf Command Checkout Files 
pushd "%CUSTOMPATH%\%1" 
"%TFPFAD%\tf.exe" checkout "$/RECY6/CUSTOM/%1/RECY/Core" /recursive 
if ERRORLEVEL 1 goto :Showerror %1 
set COREPATH=%CUSTOMPATH%\%1\RECY\Core 
set SLNPATH=%CUSTOMPATH%\%1\RECY 
set ISCUSTOMBUILD=True 
echo Corepath of %1 is %COREPATH% 
echo %SLNPATH% 
xcopy /s /e /v /y /r /k %MAINPATH% %COREPATH% 
set msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319 
call %msBuildDir%\msbuild.exe /t:Rebuild %SLNPATH%\RECY.sln /p:Configuration=Release /p:OutDir=%OUTDIR% /l:FileLogger,Microsoft.Build.Engine;logfile=CustomDllRelease_%1_%date%.log 
if ERRORLEVEL 1 goto :Showerror %1 
set msBuildDir= 
pushd "%CUSTOMPATH%\%1" 
"%TFPFAD%\tf.exe" checkin "$/RECY6/CUSTOM/%1/RECY/Core" /force /recursive /noprompt /comment:"Custom dll Build Check-In %1 %date%" /override:"Automated Build Process" 
if ERRORLEVEL 1 goto :Showerror %1 
echo CustomSolution: %1 
+0

请问你的日志文件名包含空格?如果是这样,请在第二个脚本中的日志文件名称周围添加引号,就像它在第一个脚本中一样。 'logfile =“CustomDllRelease_%1_%date%.log”' – 2014-08-27 17:48:17

+0

我已经试过了......并且没有日志文件不包含任何空格-.- – 2014-08-28 11:24:56

回答

0

你的问题不容易回答,因为我们不能运行批处理文件,第一行从@echo off更改为@echo on,查看执行博th批处理文件。

我比较了两个批处理代码块。我不明白为什么行

xcopy /s /e /v /y /r /k %MAINPATH% %OUTDIR%\ 

是在循环中调用Task作为子程序而在第二,不工作的批处理文件相同的命令是循环之下构建完成后,上述第一,工作批处理文件。

难道这是不工作的第二批文件的原因?

它始终是更安全的set使用双引号,因为它可以在下面看到,以避免一个不可见的尾随空白字符追加分配给造成了不工作的命令序列环境变量的字符串。

而我更喜欢cd /D ...而不是pushd的使用,如果popd永远不会用于恢复以前的工作目录和所有目录更改为在本地驱动器上。

此外,如果目标是目录并且可能不存在,或者在这种情况下肯定不存在,我更喜欢在使用xcopy时使用参数/i

以下是您的第二批文件,其中包含上述修改以及一些其他更改,例如通过环境变量将目录名传递给子例程Task

由于我无法测试它,我不知道这个版本的批处理文件是否正常工作,或者至少不包含语法错误。

@echo off 
REM Path containing the build drops 
set "MAINPATH=\\devteamx\BuildDrops\MAIN" 

REM Parent path of the custom solutions 
set "CUSTOMPATH=C:\Sources\RECY6\CUSTOM" 

REM Output path for the custom DLLs 
set "OUTDIR=C:\Sources\CustomRelease" 

REM Path to Visual Studion with console application tf 
set "TFPFAD=%ProgramFiles(x86)%\Microsoft Visual Studio 12.0\Common7\IDE" 

REM Execute tf with method get to get newest changes 
cd /D "%CUSTOMPATH%" 
"%TFPFAD%\tf.exe" get "$/RECY6/CUSTOM" /recursive 

rd "%OUTDIR%" /s /q 
set NEWEST= 
FOR /F %%i IN ('dir "%MAINPATH%" /b /ad-h /o-d') DO (
    SET "NEWEST=%%i" 
    GOTO end 
) 
:end 
set "MAINPATH=%MAINPATH%\%NEWEST%\x86\Release" 
echo Latest build drop of main is in %MAINPATH% 
xcopy /s /e /v /y /r /k /i "%MAINPATH%" "%OUTDIR%" 

set COREPATH= 
for /f "delims=" %%s in ('dir "%CUSTOMPATH%" /b /ad') do (
    set "SOLUTION=%%s" 
    call :Task 
) 

echo Rebuild of custom solutions succeeded. 
pause 
exit 

:Showerror 
cd /D "%CUSTOMPATH%\%SOLUTION%" 
"%TFPFAD%\tf.exe" undo "$/RECY6/CUSTOM" /recursive /noprompt 
echo Build error occurred in %SOLUTION% 
pause 
exit 

:Task 
REM Execute tf to check out the files 
cd /D "%CUSTOMPATH%\%SOLUTION%" 
"%TFPFAD%\tf.exe" checkout "$/RECY6/CUSTOM/%SOLUTION%/RECY/Core" /recursive 
if ERRORLEVEL 1 goto Showerror 
set "COREPATH=%CUSTOMPATH%\%SOLUTION%\RECY\Core" 
set "SLNPATH=%CUSTOMPATH%\%SOLUTION%\RECY" 
set "ISCUSTOMBUILD=True" 
echo Core path of %SOLUTION% is %COREPATH% 
echo %SLNPATH% 
xcopy /s /e /v /y /r /k /i "%MAINPATH%" "%COREPATH%" 
set "msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319" 
call "%msBuildDir%\msbuild.exe" /t:Rebuild "%SLNPATH%\RECY.sln" /p:Configuration=Release "/p:OutDir=%OUTDIR%" "/l:FileLogger,Microsoft.Build.Engine;logfile=CustomDllRelease_%SOLUTION%_%DATE%.log" 
if ERRORLEVEL 1 goto Showerror 
set msBuildDir= 
cd /D "%CUSTOMPATH%\%SOLUTION%" 
"%TFPFAD%\tf.exe" checkin "$/RECY6/CUSTOM/%SOLUTION%/RECY/Core" /force /recursive /noprompt "/comment:Custom dll Build Check-In %SOLUTION% %DATE%" "/override:Automated Build Process" 
if ERRORLEVEL 1 goto Showerror 
echo CustomSolution: %SOLUTION% 
+0

是的第二批文件是完全不同的。我发现我需要在构建完成后覆盖这些文件,这样我才能确定它们是正确的,并且是最新的。我不知道如果CD将在网络驱动器上工作。我记得在这种情况下我遇到了问题。而批处理工作正常,它只是由MS构建不能正常工作的日志记录....但是,谢谢我会试试这可能它神奇地似乎工作。 – 2014-09-01 06:39:03

+0

我试了一下,但仍然没有记录......我叫popd万一记录文件保存在一个不同的dir引起的一些cd或pushd ..... – 2014-09-01 06:56:39

+0

http://msdn.microsoft.com /en-US/us-en/library/wea2sca5(v=vs.90).aspx是关于msbuild.exeAnd的一些信息,是的回声得gotta帮助我的文件记录器的实例无法加载....但为什么。 ..文件记录器与另一个文件中的文件记录器相同。我已经为批处理和日志创建了自己的目录 – 2014-09-01 11:56:05

0

我明白了! 我必须将当前目录设置为dir其中的一批 删除报价 和使用其他filelogger

@echo on 
    REM Path containing the build drops 
    set "MAINPATH=C:\BuildDrops\MAIN" 

    REM Parent path of the custom solutions 
    set "CUSTOMPATH=C:\Sources\RECY6\CUSTOM" 

    REM Output path for the custom DLLs 
    set "OUTDIR=C:\Users\Administrator\Desktop\Deploy" 

    REM Path to Visual Studion with console application tf 
    set "TFPFAD=%ProgramFiles(x86)%\Microsoft Visual Studio 11.0\Common7\IDE" 

    REM Custom dll Path 
    set "LOGPATH=C:\Users\Administrator\Desktop\RECY CustomDeployment" 

    REM Execute tf with method get to get newest changes 
    cd /D "%CUSTOMPATH%" 
    "%TFPFAD%\tf.exe" get "$/RECY6/CUSTOM" /recursive 

    rd "%OUTDIR%" /s /q 
    set NEWEST= 
    FOR /F %%i IN ('dir "%MAINPATH%" /b /ad-h /o-d') DO (
     SET "NEWEST=%%i" 
     GOTO end 
    ) 
    :end 
    set "MAINPATH=%MAINPATH%\%NEWEST%\x86\Release" 
    echo Latest build drop of main is in %MAINPATH% 

    set COREPATH= 
    for /f "delims=" %%s in ('dir "%CUSTOMPATH%" /b /ad') do (
     set "SOLUTION=%%s" 
     call :Task 
    ) 


    xcopy /s /e /v /y /r /k /i "%MAINPATH%" "%OUTDIR%" 
    REM pushd "%CUSTOMPATH%" 
    REM "%TFPFAD%\tf.exe" undo "$/RECY6/CUSTOM" /recursive /noprompt 
    echo Rebuild of custom solutions succeeded. 
    pause 
    exit 

    :Showerror 
    cd /D "%CUSTOMPATH%\%SOLUTION%" 
    "%TFPFAD%\tf.exe" undo "$/RECY6/CUSTOM" /recursive /noprompt 
    echo Build error occurred in %SOLUTION% 
    pause 
    exit 

    :Task 
    REM Execute tf to check out the files 
    cd /D "%CUSTOMPATH%\%SOLUTION%" 
    "%TFPFAD%\tf.exe" checkout "$/RECY6/CUSTOM/%SOLUTION%/RECY/Core" /recursive 
    if ERRORLEVEL 1 goto Showerror 
    set "COREPATH=%CUSTOMPATH%\%SOLUTION%\RECY\Core" 
    set "SLNPATH=%CUSTOMPATH%\%SOLUTION%\RECY" 
    set "ISCUSTOMBUILD=True" 
    echo Core path of %SOLUTION% is %COREPATH% 
    echo %SLNPATH% 
    xcopy /s /e /v /y /r /k "%MAINPATH%" "%COREPATH%" 
    cd /D %LOGPATH% 
    set "msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319" 
    call "%msBuildDir%\msbuild.exe" /t:Rebuild "%SLNPATH%\RECY.sln" /p:Configuration=Release "/p:OutDir=%OUTDIR%" /fileLogger /flp:logfile=CustomDllRelease_%SOLUTION%_%DATE%.log 
    if ERRORLEVEL 1 goto Showerror 
    set msBuildDir= 
    cd /D "%CUSTOMPATH%\%SOLUTION%" 
    "%TFPFAD%\tf.exe" checkin "$/RECY6/CUSTOM/%SOLUTION%/RECY/Core" /force /recursive /noprompt "/comment:Custom dll Build Check-In %SOLUTION% %DATE%" "/override:Automated Build Process" 
    if ERRORLEVEL 1 goto Showerror 
    echo CustomSolution: %SOLUTION% 
+0

是的非常感谢帮助:D:D祝你有美好的一天! – 2014-09-02 12:53:00

相关问题