проанализировать исходный вывод безопасной истории и запустить команду diff - PullRequest
0 голосов
/ 13 января 2012

Я довольно новичок в написании пакетных скриптов.Я пытаюсь написать файл сценария для решения следующей задачи.

У меня есть приведенная ниже исходная безопасная команда для получения списка файлов, измененных между двумя датами

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>

В основном я пыталсясравнить предыдущую версию с текущей версией для каждого файла в выходных данных.

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

3 голосов
/ 13 января 2012

Это должно дать вам то, что вы просили.Но похоже, что в указанной команде 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
    )
  )
)

Вот версия, которая добавляет информацию о проекте из строки «Checked in»

@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 голосов
/ 14 января 2012

В основном вам нужен цикл 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=
    )
  )
)

Должно быть, вроде как работает.

...