2015-02-12 4 views
1

У меня есть пакетный файл, который выполняет часть процесса сборки программного обеспечения. Он вытаскивает текущее имя тега из системы сборки и помещает его в сгенерированный исходный файл C. Если источник не создается из тега, он получает имя последнего тега (формы 1.2.34 или 1.23). Затем он увеличивает «номер сборки» на 1 и добавляет текст «Разработка». Или, по крайней мере, это должно быть. Вот что я придумал:Приращение последней последовательности чисел, разделенных периодом, в пакетном файле

REM Increment the release tag. This will only work for Vx.y.z type release tags. 
for /f "delims=. tokens=1-3" %%A in ("!_lasttag!") do (
    set /a lastv = %%C + 1 
    set "tag=%%A.%%B.!lastv! (Development)" 
) 

вход в _lasttag, выход в tag.

Это прекрасно подходит для тегов формы «x.y.zz», но не удается, если кто-то делает фиксацию на теге формы «1.23».

Есть ли лучший способ сделать это?

В идеале я хотел то, что будет работать на любой из следующих версии насчитывающие случая:

1.2 
1.2.34 
1.2.34.56 

Моя следующая идея (с точки зрения того, как это сделать) было перебирать струны с FOR к подсчитайте жетоны, затем сделайте это снова, пока количество токенов не достигнет последнего токена. Я закончил с этим:

set _nvertags=0 
    for /f "delims=." %%A in ('echo !_lasttag!') do (
    echo %%A 
    set /a _nvertags+=1 
) 

Но вместо того, чтобы цикл через три раза (с входом «1.2.34»), она работала только один раз, в результате чего nvertags набор 1. Очевидно, что я что-то не хватает где-то .. .

+0

не уверен, что проблема exactly.You хочет разбить строку с числами от '.' и принимать какие части? – npocmaka

ответ

2
for %%a in ("!_lasttag!") do for /f "delims=." %%b in ("%%~xa.0") do (
    set /a "lastv=%%b+1" 
    set "tag=%%~na.!lastv! (Development)" 
) 

Просто подумайте, что добавленный номер является именем файла с расширением. Получите расширение, увеличьте его и объедините остальные элементы.

+0

Я не понимаю цели '.0' в вашем втором цикле FOR. – dbenham

+0

@dbenham В неверном случае 'set_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _' 'заставляет второй цикл оценивать, а поведение в этом случае не указано в вопросе ОП, по крайней мере, это не сработает, создав «1.1» –

+0

Интересная мысль, но может быть лучше, что внутренний цикл не срабатывает, поскольку это недопустимый ввод. – dbenham

0

Как и решение MC ND, но без дополнительной петли FOR/F. Я использую операцию подстроки устранить точку с «расширения»

for %%V in ("!_lasttag!") do (
    set "end=%%~xV" 
    set /a "end=!end:~1!+1" 
    set "tag=%%~nV.!end! (Development)" 
) 
Смежные вопросы