2014-08-27 77 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

相關問題