Извлечение имен файлов из вывода консоли SVN

318
nl-x

Моя SVN updateкоманда SVN Tortoise обычно возвращает мне такой вывод:

C:\proj>svn update Updating '.': A 'some-file1.txt' D 'some-file2.txt' Restored 'some-file3.txt' U 'some'file4.txt' C 'some file5.txt' B At revision 123. 

Обратите внимание, что за исключением первой строки (всегда начинающейся с Updating) и последней строки (всегда начинающейся с At), каждая строка всегда будет иметь:

  • действие в первом столбце. Это может быть буква или слово
  • файл во втором столбце, заключенный в одинарные кавычки. К сожалению, имена файлов могут содержать одинарные кавычки или пробелы внутри них!
  • возможно больше столбцов с одиночными буквами в них. Но мне плевать на них.

В командном файле, который я пишу, мне нужны действия и файлы. Действия, которые мне удается получить, но, кажется, файлы слишком сложны для меня. Технически, все, что я хочу, это все между первой одинарной кавычкой и последней одинарной кавычкой в ​​строке .

@echo off setlocal enabledelayedexpansion for /f "delims=" %%a in ('"svn update"') DO ( set line=%%a for /f "tokens=1" %%b in ("!line!") do ( set action=%%b if "!action!" neq "Updating" ( if "!action!" neq "At" ( set file= >>> I DON'T KNOW WHAT TO DO HERE <<< echo We did !action! to !file! ) ) ) ) 

Как только этот пакетный файл работает правильно, он должен вывести:

We did A on some-file1.txt We did D on some-file2.txt We did Restored on some-file1.txt We did U on some'file1.txt We did C on some file1.txt 
1
Это должно быть летучая мышь, или это может быть vbscript или даже awk? Кажется, что требование состоит в том, чтобы извлечь поле 1 и поле 2 из выходного файла, но проблема заключается в определении поля, особенно для поля 2. Это не пространство завершено. Это не в кавычках. Я не думаю, что вы можете сделать достаточно точное определение для поля 2 - как бы вы обработали, например, «C» some »file5.txt« B »- какое бы определение вы не использовали для этого примера, это неверно. Ian McGowan 5 лет назад 0
Добавить предложенный подход - если после поля 2 нет кавычек, то определить поле два как «все, начиная от первой цитаты в строке, ищущей вперед, до всего в последней цитате в строке, ищущей в обратном направлении»? Я могу себе представить, что делать это довольно легко в vbscript, perl или awk, но не в bat. Ian McGowan 5 лет назад 0

1 ответ на вопрос

0
nl-x

Я, кажется, нашел решение с powershell, заменив set file=строку следующим

for /f "delims=" %%c in ('"C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -Command ""$Env:line -replace '^^[^^'']*''' -replace '''[^^'']*$'"" "') DO ( set file=%%c ) 

Powershell берет %line%(там это называется $Env:line), заменяет ^[^']*'ничем, заменяет '[^']*$ничем и возвращает строку, которая затем перехватывается for /fи помещается в%file%

Похожие вопросы