質問

I am fairly new to writing batch scripts. I am trying to write a script file to achieve the following task.

I have a source safe command below to get the list of files changed between two dates

ss.exe history $/myproject -Vd04/01/2012~01/01/2012 -R  

The output of the above command is as follows

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: 

With the output above, I want to read the file name (allpages.master, AdminTsSetup.aspx.vb) and version of each file from the output and run the following command

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

Basically, I was trying to compare the previous version with the current version for each file in the output.

Can some one please help?

役に立ちましたか?

解決

This should give you what you asked for. But it seems like the diff command you specified is missing a reference to the project.

This solution should work even if the file name contains spaces, !, ;, or any special characters like & or ^.

@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
    )
  )
)

Here is a version that adds the project information from the "Checked in" line

@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
    )
  )
)

他のヒント

Basically you need a for loop and a little state:

@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=
    )
  )
)

Should kinda work, I guess.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top