2012-01-13 44 views
0

我對編寫批處理腳本相當陌生。我正在嘗試編寫一個腳本文件來實現以下任務。解析源安全歷史輸出並運行diff命令

下面我有一個源安全的命令來獲取兩個日期

ss.exe history $/myproject -Vd04/01/2012~01/01/2012 -R 
之間更改的文件列表

上述命令的輸出如下

Building list for $/myproject....................................................... 
.................................................................................... 
................................... 

***** AllPages.master ***** 
Version 67 
User: user1    Date: 1/12/12 Time: 1:08p 
Checked in $/myproject/websites/website1 
Comment: 

***** AdminTSSetup.aspx.vb ***** 
Version 10 
User: user2    Date: 1/12/12 Time: 1:09 p 
Checked in $/myproject/websites/website1 
Comment: 

有了上面的輸出,我想要從輸出中讀取文件名(allpages.master,AdminTsSetup.aspx.vb)和每個文件的版本並運行以下命令:

SS diff -DS <filename from output> -V<version from output - 1>~<version from output> 

基本上,我試圖將以前的版本與輸出中每個文件的當前版本進行比較。

有人可以幫忙嗎?

+0

Coudl包含樣本輸出嗎?並非每個可能能夠幫助的人都看到了SourceSafe輸出。 – Joey 2012-01-13 15:45:00

+0

我加了輸出 – Sridhar 2012-01-13 20:23:21

回答

3

這應該會給你你所要求的。但它似乎是你指定的diff命令缺少對該項目的引用。

即使文件名中包含空格,!,;或任何特殊字符(如&或^),此解決方案也應該可以工作。

@echo off 
setlocal disableDelayedExpansion 
for /f "delims=*" %%A in ('ss.exe history $/myproject -Vd04/01/2012~01/01/2012 -R ^| findstr /b "***** Version"') do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    if "!ln:~0,1!"==" " (
    for /f "eol=: delims=" %%F in ("!ln:~1!") do (
     endlocal 
     set "file=%%~nxF" 
    ) 
) else (
    for /f "tokens=2 delims= " %%V in ("!ln!") do (
     set /a "version1=%%V, version0=version1-1" 
     ss.exe dif -DS "!file!" -V!version0!~!version1! 
     endlocal 
    ) 
) 
) 

下面是從「簽入」行

@echo off 
setlocal disableDelayedExpansion 
for /f "delims=*" %%A in ('ss.exe history $/myproject -Vd04/01/2012~01/01/2012 -R ^| findstr /b "***** Version Checked"') do (
    set "ln=%%A" 
    setlocal enableDelayedExpansion 
    if "!ln:~0,1!"==" " (
    for /f "eol=: delims=" %%F in ("!ln:~1!") do (
     endlocal 
     set "file=%%~nxF" 
    ) 
) else if "!ln:~0,1!"=="V" (
    for /f "tokens=2 delims= " %%V in ("!ln!") do (
     endlocal 
     set /a "version1=%%V, version0=version1-1" 
    ) 
) else (
    for /f "tokens=2* delims= " %%B in ("!ln!") do (
     endlocal 
     set "proj=%%C" 
     setlocal enableDelayedExpansion 
     ss.exe dif -DS "!proj!/!file!" -V!version0!~!version1! 
     endlocal 
    ) 
) 
) 
+0

@Sridhar - 嗯,看起來像什麼?編輯您的帖子並在那裏添加歷史命令的樣本輸出。 – dbenham 2012-01-13 17:46:57

+0

輸出看起來像「建立$/myproject列表............................ *****文件名*** **版本67 – Sridhar 2012-01-13 17:50:26

+0

這裏真的很難輸入輸出,我可以以其他方式發送給你嗎? – Sridhar 2012-01-13 17:51:20

0

基本上你需要一個for環和一個小國家增加了項目信息的版本:

@echo off 
setlocal enabledelayedexpansion 
for /f "tokens=1,2 delims= " %%i in ('ss.exe history $/myproject -Vd04/01/2012~01/01/2012 -R') do (
    if "%%i"=="*****" (
    rem a file name 
    set "FileName=%%j" 
) else (
    if "%%i"=="Version" (
     set Version=%%j 
     set /a LastVersion=Version - 1 
     ss diff -DS "!FileName!" -V!LastVersion!~!Version! 
     set FileName=&set Version=&setLastVersion= 
    ) 
) 
) 

應該還挺工作,我猜。

+0

它給出了錯誤「tokens = 1,2 delims =」在這個時候出乎意料的是 – Sridhar 2012-01-13 21:32:55

+0

對,這是錯誤的地方。抱歉。 – Joey 2012-01-13 21:33:33

+0

如果文件名包含或!,此解決方案將不起作用。可能不是大多數開發環境的問題。但你永遠不知道。 – dbenham 2012-01-13 21:38:28